定義:一個用函數作爲參數或者返回值的函數
如何定義:()->Unit 括號裏面代表函數的參數,箭頭後面代表函數的返回值。
傳遞一個函數,或要將這個函數賦值給一個變量的時候,需要在函數前面加雙冒號。
這個雙冒號的寫法,叫函數引用Function Reference
加了兩個冒號,這個函數才變成了一個對象。
在kotlin裏 [ 函數可以作爲參數 ] 這件事的本質是函數可以作爲對象存在。
因爲只有是對象纔可以被作爲參數傳遞。
kotlin中函數就是函數,不是對象。
kotlin選擇創建一個和函數具有相同功能的對象(用雙冒號)。
一個指向對象的引用。
這個對象不是函數本身,而是一個和這個函數具有相同功能的對象。
怎麼相同?你可以怎麼用這個函數,就可以怎麼用它(加了雙冒號的對象)。
只有函數類型的對象,才能調用invoke(在函數對象後面直接加括號是kotlin的語法糖)。
函數就是函數,它和對象是兩個維度的東西。
雙冒號表達的是它是一個指向對象的引用,而不是指向函數本身。
而是指向一個我們在代碼中看不見的對象。
這個對象複製了原函數的功能。
fun a(params: (Int) -> String) {
println("aaa")
}
fun b(int: Int): String {
return "acb"
}
fun main() {
a(::b)
val c = ::b
c.invoke(1)
c(2)
}
除了用雙冒號引用,還可以直接把函數挪過來寫
這種寫法叫匿名函數
注:d不是函數的名字,而是變量的名字,指向這個匿名函數類型的對象。
val d = fun(param: Int): String {
return param.toString()
}
val z : (Int)->String = {
it.toString()
}
val y: () -> Unit = {
println("hahaha")
}
val w = {
println("???")
}
如果Lambda是函數的最後一個參數,可以把lambda寫在括號外面,
而如果lambda是函數唯一的參數,可以把參數省略,用it指代這個參數
lambda的返回值不是用return,而是取最後一行代碼的值
kotlin的匿名函數其實不是函數,而是個對象,它和(::+函數名)是一個東西。
同理Lambda也是一個函數類型的對象。