說說Kotlin lambda 那些事兒

Lambda

  1. 基本形式:
    函數類型 – (R, T) -> R,因此 fold 接受一個函數作爲參數, 該函數接受類型分別爲 R 與 T 的兩個參數並返回一個 R 類型的值。
    -> 後面接的是函數體,函數體的最後一句表達式結果就是lambda表達式的返回值

  2. lambda表達式的本質是匿名函數,在底層以匿名函數來實現
    減少了代碼量編寫,同時使代碼更加簡潔明瞭

Lambda表達式的特點

  • Lambda表達式總是被大括號括着
  • 其參數(如果存在)在 -> 之前聲明(參數類型可以省略)
  • 函數體(如果存在)在 -> 後面。

總結:
lambda表達式是一個語法糖(所謂與語法糖,就是對程序員友好的東西),lambda總是被大括號包裹着

Lambda 表達式用法

  1. 無參數的情況 :
    val/var 變量名 = { 操作的代碼 }

  2. 有參數的情況
    val/var 變量名 : (參數的類型,參數類型,…) -> 返回值類型 = {參數1,參數2,… -> 操作參數的代碼 }

可等價於
// 此種寫法:即表達式的返回值類型會根據操作的代碼自推導出來。
val/var 變量名 = { 參數1 : 類型,參數2 : 類型, … -> 操作參數的代碼 }

  1. lambda表達式作爲函數中的參數的時候,這裏舉一個例子:
    fun test(a : Int, 參數名 : (參數1 : 類型,參數2 : 類型, … ) -> 表達式返回類型){

    }

匿名函數:

  • 匿名函數的特點是可以明確指定其返回值類型。
  • 它和常規函數的定義幾乎相似。他們的區別在於,匿名函數沒有函數名。
  • 匿名函數和lambda表達式的區別:
    1. 匿名函數的參數傳值,總是在小括號內部傳遞。而Lambda表達式傳值,可以有省略小括號的簡寫寫法。
    2. 在一個不帶標籤的return語句中,匿名函數時返回值是返回自身函數的值,而Lambda表達式的返回值是將包含它的函數中返回。

下劃線:

val map = mapOf(“key1” to “value1”,“key2” to “value2”,“key3” to “value3”)

map.forEach{
key , value -> println("$key \t $value")
}

// 不需要key的時候
map.forEach{
_ , value -> println("$value")
}

閉包
java:不支持閉包,因此對象是他的一等公民,而函數,變量是二等公民
kotlin:支持閉包,函數中可以嵌套函數(如:匿名函數,lambda,局部函數,表達式),因此函數和變量是一等公民,而對象屬於二等公民

閉包的形式

  1. 攜帶狀態

  2. 引用外部變量,並改變外部變量的值

注意:

  1. Lambda 只會返回閉包傳遞的最後一個返回值

  2. 語法糖:指計算機語言中添加的某種語法,這種語法對語言的功能並沒有影響,但是方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。
    之所以叫語法糖,不只是因爲加糖後的代碼功能與加糖前的保持一致,更重要的是,糖在不改變其所在位置的語法結構的前提下,實現了運行時的等價

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章