Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 函數(shù)

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)品級(jí)特性
翻譯來源

高階函數(shù)

高階函數(shù) 是以另一個(gè)函數(shù)為參數(shù)或者返回值的函數(shù)。

以另一個(gè)函數(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 定義一個(gè)高階函數(shù),他有兩個(gè)int參數(shù) x,y,同時(shí)他還有一個(gè)函數(shù)作為參數(shù):operation。在operation的申明中,他的參數(shù)和返回值已經(jīng)申明。
  • 2 這個(gè)高階函數(shù)的內(nèi)部實(shí)現(xiàn)是獲得operation的返回值在傳入x,y的情況下。
  • 3 定義一個(gè)函數(shù),與operation的定義很像。
  • 4 執(zhí)行這個(gè)高階函數(shù),傳入兩個(gè)int值的參數(shù),和傳入一個(gè)函數(shù)參數(shù)::sum。:: 在kotlin中是一個(gè)使用名字來提取方法的符號(hào)。
  • 5 執(zhí)行這個(gè)高階函數(shù),插入兩個(gè)int值的參數(shù),和傳入一個(gè)lambda為參數(shù)。這種寫法是不是看起來很簡(jiǎn)潔?
以一個(gè)函數(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 定義一個(gè)高階函數(shù),他返回一個(gè)函數(shù)作為返回值。在這里(Int) -> Int的寫法是申明的返回值的函數(shù)的結(jié)構(gòu)。這里定義了返回square函數(shù)
  • 2 定義名字叫square的函數(shù),他的作用是返回x*x
  • 3 執(zhí)行這個(gè)高階函數(shù),獲取一個(gè)函數(shù)作為返回值。在這里,operation()返回的func 就是square方法
  • 4 執(zhí)行func。這里square方法會(huì)被執(zhí)行、

lambda 表達(dá)式

Lambda表達(dá)式是一種為了方便創(chuàng)建函數(shù)對(duì)等式(就是 相當(dāng)于一種函數(shù))。lambda 可以很簡(jiǎn)潔地表明函數(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?;ɡㄌ?hào)里面的內(nèi)容就是lambda,這部分被賦值為類型為 (String) -> String的一個(gè)內(nèi)容。
  • 2 lambda 內(nèi)部有發(fā)生類型推論。有這個(gè)推論的原因是,在外部定義了明確的類型。
  • 3 lambda 外部發(fā)生了類型推論,這是因?yàn)閘ambda 內(nèi)部的參數(shù)類型和返回值是可推論的
  • 4 你不能在lambda 內(nèi)部和外部同時(shí)省略類型,這將無法進(jìn)行類型推論。
  • 5 如果只有一個(gè)參數(shù),你可以不定義lambda 內(nèi)部的參數(shù)名字,默認(rèn)使用it
  • 6 如果你的lambda只有一個(gè)單一的函數(shù)調(diào)用,那么你就可以直接使用函數(shù)指針(::)

Extension Functions 擴(kuò)展函數(shù) 和 Properties 屬性

kotlin 可以通過 擴(kuò)展機(jī)制 讓你擴(kuò)展任何的class 。顧名思義,有兩種擴(kuò)展方式:擴(kuò)展方法和擴(kuò)展屬性。他們看起來像是普通的方法和屬性,除了一點(diǎn),你必須明確的說明你是要擴(kuò)展那個(gè)類。

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 定義了兩個(gè) data class,item 和 order ,其中 order 包含了一個(gè)items的屬性
  • 2 添加一個(gè)Order的擴(kuò)展函數(shù)
  • 3 添加一個(gè)Order的擴(kuò)展屬性
  • 4 執(zhí)行 order的 擴(kuò)張方法 maxPricedItemName()
  • 5 訪問 order的擴(kuò)展屬性 commaDelimitedItemNames

甚至你可以為null 擴(kuò)展方法。在擴(kuò)展方法中,你可以對(duì)this 進(jìn)行檢查是否為null,并根據(jù)檢查結(jié)果做出你的邏輯

fun <T> T?.nullSafeToString() = this?.toString() ?: "NULL"  // 1
fun main() {
    println(null.nullSafeToString())
    println("Kotlin".nullSafeToString())
}
  • 1 定義了一個(gè)泛型方法,這個(gè)方法可以由null 來調(diào)用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容