Kotlin 語法基礎(chǔ)大全屯蹦,從例子著手的 從0到1的學(xué)習(xí) -- 基礎(chǔ)介紹
Kotlin 語法基礎(chǔ)大全宣蠕,從例子著手的 從0到1的學(xué)習(xí) -- 流程控制
Kotlin 語法基礎(chǔ)大全脖捻,從例子著手的 從0到1的學(xué)習(xí) -- 特殊的類
Kotlin 語法基礎(chǔ)大全夺溢,從例子著手的 從0到1的學(xué)習(xí) -- 函數(shù)
Kotlin 語法基礎(chǔ)大全论巍,從例子著手的 從0到1的學(xué)習(xí) -- 集合
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 作用域
Kotlin 語法基礎(chǔ)大全风响,從例子著手的 從0到1的學(xué)習(xí) -- 代理
Kotlin 語法基礎(chǔ)大全嘉汰,從例子著手的 從0到1的學(xué)習(xí) -- 產(chǎn)品級特性
翻譯來源
高階函數(shù)
高階函數(shù) 是以另一個函數(shù)為參數(shù)或者返回值的函數(shù)。
以另一個函數(shù)為參數(shù)
fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int { // 1
return operation(x, y) // 2
}
fun sum(x: Int, y: Int) = x + y // 3
fun main() {
val sumResult = calculate(4, 5, ::sum) // 4
val mulResult = calculate(4, 5) { a, b -> a * b } // 5
println("sumResult $sumResult, mulResult $mulResult")
}
- 1 定義一個高階函數(shù)状勤,他有兩個int參數(shù) x鞋怀,y双泪,同時他還有一個函數(shù)作為參數(shù):operation。在operation的申明中密似,他的參數(shù)和返回值已經(jīng)申明焙矛。
- 2 這個高階函數(shù)的內(nèi)部實(shí)現(xiàn)是獲得operation的返回值在傳入x,y的情況下残腌。
- 3 定義一個函數(shù)村斟,與operation的定義很像。
- 4 執(zhí)行這個高階函數(shù)抛猫,傳入兩個int值的參數(shù)蟆盹,和傳入一個函數(shù)參數(shù)
::sum
。::
在kotlin中是一個使用名字來提取方法的符號闺金。 - 5 執(zhí)行這個高階函數(shù)逾滥,插入兩個int值的參數(shù),和傳入一個lambda為參數(shù)掖看。這種寫法是不是看起來很簡潔匣距?
以一個函數(shù)作為返回值
fun operation(): (Int) -> Int { // 1
return ::square
}
fun square(x: Int) = x * x // 2
fun main() {
val func = operation() // 3
println(func(2)) // 4
}
- 1 定義一個高階函數(shù),他返回一個函數(shù)作為返回值哎壳。在這里
(Int) -> Int
的寫法是申明的返回值的函數(shù)的結(jié)構(gòu)毅待。這里定義了返回square
函數(shù) - 2 定義名字叫
square
的函數(shù),他的作用是返回x*x
- 3 執(zhí)行這個高階函數(shù)归榕,獲取一個函數(shù)作為返回值尸红。在這里,
operation()
返回的func
就是square
方法 - 4 執(zhí)行
func
刹泄。這里square
方法會被執(zhí)行外里、
lambda 表達(dá)式
Lambda表達(dá)式是一種為了方便創(chuàng)建函數(shù)對等式(就是 相當(dāng)于一種函數(shù))。lambda 可以很簡潔地表明函數(shù)特石,通過使用默認(rèn)參數(shù)it
// All examples create a function object that performs upper-casing.
// So it's a function from String to String
val upperCase1: (String) -> String = { str: String -> str.toUpperCase() } // 1
val upperCase2: (String) -> String = { str -> str.toUpperCase() } // 2
val upperCase3 = { str: String -> str.toUpperCase() } // 3
// val upperCase4 = { str -> str.toUpperCase() } // 4
val upperCase5: (String) -> String = { it.toUpperCase() } // 5
val upperCase6: (String) -> String = String::toUpperCase // 6
println(upperCase1("hello"))
println(upperCase2("hello"))
println(upperCase3("hello"))
println(upperCase5("hello"))
println(upperCase6("hello"))
- 1 A lambda in all its glory, with explicit types everywhere盅蝗。花括號里面的內(nèi)容就是lambda姆蘸,這部分被賦值為類型為
(String) -> String
的一個內(nèi)容墩莫。 - 2 lambda 內(nèi)部有發(fā)生類型推論。有這個推論的原因是逞敷,在外部定義了明確的類型狂秦。
- 3 lambda 外部發(fā)生了類型推論,這是因?yàn)閘ambda 內(nèi)部的參數(shù)類型和返回值是可推論的
- 4 你不能在lambda 內(nèi)部和外部同時省略類型推捐,這將無法進(jìn)行類型推論裂问。
- 5 如果只有一個參數(shù),你可以不定義lambda 內(nèi)部的參數(shù)名字,默認(rèn)使用it
- 6 如果你的lambda只有一個單一的函數(shù)調(diào)用堪簿,那么你就可以直接使用函數(shù)指針
(::)
Extension Functions 擴(kuò)展函數(shù) 和 Properties 屬性
kotlin 可以通過 擴(kuò)展機(jī)制 讓你擴(kuò)展任何的class 痊乾。顧名思義,有兩種擴(kuò)展方式:擴(kuò)展方法和擴(kuò)展屬性戴甩。他們看起來像是普通的方法和屬性符喝,除了一點(diǎn),你必須明確的說明你是要擴(kuò)展那個類甜孤。
data class Item(val name: String, val price: Float) // 1
data class Order(val items: Collection<Item>)
fun Order.maxPricedItemValue(): Float = this.items.maxBy { it.price }?.price ?: 0F // 2
fun Order.maxPricedItemName() = this.items.maxBy { it.price }?.name ?: "NO_PRODUCTS"
val Order.commaDelimitedItemNames: String // 3
get() = items.map { it.name }.joinToString()
fun main() {
val order = Order(listOf(Item("Bread", 25.0F), Item("Wine", 29.0F), Item("Water", 12.0F)))
println("Max priced item name: ${order.maxPricedItemName()}") // 4
println("Max priced item value: ${order.maxPricedItemValue()}")
println("Items: ${order.commaDelimitedItemNames}") // 5
}
/*
Max priced item name: Wine
Max priced item value: 29.0
Items: Bread, Wine, Water
*/
- 1 定義了兩個 data class协饲,item 和 order ,其中 order 包含了一個items的屬性
- 2 添加一個Order的擴(kuò)展函數(shù)
- 3 添加一個Order的擴(kuò)展屬性
- 4 執(zhí)行 order的 擴(kuò)張方法 maxPricedItemName()
- 5 訪問 order的擴(kuò)展屬性 commaDelimitedItemNames
甚至你可以為null 擴(kuò)展方法缴川。在擴(kuò)展方法中茉稠,你可以對this 進(jìn)行檢查是否為null,并根據(jù)檢查結(jié)果做出你的邏輯
fun <T> T?.nullSafeToString() = this?.toString() ?: "NULL" // 1
fun main() {
println(null.nullSafeToString())
println("Kotlin".nullSafeToString())
}
- 1 定義了一個泛型方法把夸,這個方法可以由null 來調(diào)用