Lambda
-
基本形式:
函數類型 – (R, T) -> R,因此 fold 接受一個函數作爲參數, 該函數接受類型分別爲 R 與 T 的兩個參數並返回一個 R 類型的值。
-> 後面接的是函數體,函數體的最後一句表達式結果就是lambda表達式的返回值 -
lambda表達式的本質是匿名函數,在底層以匿名函數來實現
減少了代碼量編寫,同時使代碼更加簡潔明瞭
Lambda表達式的特點
- Lambda表達式總是被大括號括着
- 其參數(如果存在)在 -> 之前聲明(參數類型可以省略)
- 函數體(如果存在)在 -> 後面。
總結:
lambda表達式是一個語法糖(所謂與語法糖,就是對程序員友好的東西),lambda總是被大括號包裹着
Lambda 表達式用法
-
無參數的情況 :
val/var 變量名 = { 操作的代碼 } -
有參數的情況
val/var 變量名 : (參數的類型,參數類型,…) -> 返回值類型 = {參數1,參數2,… -> 操作參數的代碼 }
可等價於
// 此種寫法:即表達式的返回值類型會根據操作的代碼自推導出來。
val/var 變量名 = { 參數1 : 類型,參數2 : 類型, … -> 操作參數的代碼 }
- lambda表達式作爲函數中的參數的時候,這裏舉一個例子:
fun test(a : Int, 參數名 : (參數1 : 類型,參數2 : 類型, … ) -> 表達式返回類型){
…
}
匿名函數:
- 匿名函數的特點是可以明確指定其返回值類型。
- 它和常規函數的定義幾乎相似。他們的區別在於,匿名函數沒有函數名。
- 匿名函數和lambda表達式的區別:
- 匿名函數的參數傳值,總是在小括號內部傳遞。而Lambda表達式傳值,可以有省略小括號的簡寫寫法。
- 在一個不帶標籤的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,局部函數,表達式),因此函數和變量是一等公民,而對象屬於二等公民
閉包的形式
-
攜帶狀態
-
引用外部變量,並改變外部變量的值
注意:
-
Lambda 只會返回閉包傳遞的最後一個返回值
-
語法糖:指計算機語言中添加的某種語法,這種語法對語言的功能並沒有影響,但是方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。
之所以叫語法糖,不只是因爲加糖後的代碼功能與加糖前的保持一致,更重要的是,糖在不改變其所在位置的語法結構的前提下,實現了運行時的等價