Java轉Kotlin:Lambda表達式

1 匿名函數

  • 普通函數
//Kotlin
fun f1() {
    println("Hello")
}
複製代碼

以上是一個省略了函數類型的普通函數,該函數有本身的名字f1,函數類型是()->Unit函數

  • 匿名函數
//Kotlin
val f2 = fun() {
    println("Hello")
}
複製代碼

以上賦值號右邊是一個沒有函數名的匿名函數,能夠賦值給變量f2,執行f2()或者f2.invoke()來調用該匿名函數。ui

與普通函數同樣,該匿名函數的函數類型是()->Unitspa

2 Lambda表達式

Lambda表達式本質上是一種更具表現力的匿名函數3d

2.1 Lambda表達式定義

圖中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")
}
複製代碼

2.2 Lambda表達式類型推導

  • 若Lambda表達式無輸入參數,則其類型()->Any?能夠省略
  • Lambda表達式的最後一行表達式的類型就是整個表達式的返回類型

好比:編譯器

但凡表達式輸入參數,則必定要顯式聲明每一個傳入參數的類型,不然報錯string

總之,必定要讓編譯器可以推導出傳入參數的類型。

小結

相關文章
相關標籤/搜索