//Kotlin
fun f1() {
println("Hello")
}
複製代碼
以上是一個省略了函數類型的普通函數,該函數有本身的名字f1
,函數類型是()->Unit
。函數
//Kotlin
val f2 = fun() {
println("Hello")
}
複製代碼
以上賦值號右邊是一個沒有函數名的匿名函數,能夠賦值給變量f2
,執行f2()
或者f2.invoke()
來調用該匿名函數。ui
與普通函數同樣,該匿名函數的函數類型是()->Unit
。spa
Lambda表達式本質上是一種更具表現力的匿名函數。3d
圖中Kotlin Lambda表達式的函數類型爲()->Unit
。Java中沒有傳入參數不能省略括號,Kotlin中能省略括號。code
Java 8中也新增了Lambda表達式,Java 10中新增了類型推導var
,可是Java中的Lambda表達式的類型沒法進行類型推導,本質上是由於Java中的函數(方法)不是類型,不是「一等公民」。所以須要顯示聲明類型,通常定義一個SAM(Simple Abstract Method)接口來定義這個Lambda表達式的類型。cdn
上圖Java中的Lambda表達式就是利用了SAM來定義表達式的類型。blog
在Kotlin中,Lambda表達式的常規定義以下:接口
//Kotlin
val lambda0: () -> Unit = {
println("Hello")
}
val lambda1: (Int) -> Unit = {
println(it)
}
val lambda2: (Int, String) -> Unit = { i: Int, s: String ->
println("$i $s")
}
複製代碼
()->Any?
能夠省略好比:編譯器
但凡表達式輸入參數,則必定要顯式聲明每一個傳入參數的類型,不然報錯:string
總之,必定要讓編譯器可以推導出傳入參數的類型。