【Kotlin】Lambda表示式

little_fat_sheep發表於2024-04-07

1 常規呼叫

Lambda 表示式總結 中對 Java 的 Lambda 表示式進行了總結,本文將對 Kotlin 中的 Lambda 表示式進行總結。

1.1 無參函式

fun main() {
    var myFun: () -> Unit = {
        println("test")
    }
    myFun() // 列印: test
}

​ 以上程式碼等價於:

fun main() {
    var myFun: () -> Unit = fun() {
        println("test")
    }
    myFun() // 列印: test
}

1.2 有參函式

fun main() {
    var myFun: (String) -> Unit = { a ->
        println("test, $a")
    }
    myFun("abc") // 列印: test, abc
}

​ 以上程式碼等價於:

fun main() {
    var myFun: (String) -> Unit = fun(a: String) {
        println("test, $a")
    }
    myFun("abc") // 列印: test, abc
}

​ 當只有一個引數時,可以使用 it 簡化 Lambda 表示式,如下。

fun main() {
    var myFun: (String) -> Unit = {
        println("test, $it")
    }
    myFun("abc") // 列印: test, abc
}

​ 如果不使用某個引數,可以使用下劃線(_)簡化,如下。

fun main() {
    var myFun: (Int, Int) -> Unit = { _, b ->
        println("test, $b")
    }
    myFun(3, 5) // 列印: test, 5
}

1.3 有返回值函式

​ Lambda 表示式中最後一行將作為返回值返回。

fun main() {
    var myFun: (Int, Int) -> Int = { a, b ->
        a + b
    }
    println(myFun(3, 5)) // 列印: 8
}

​ 以上程式碼等價於:

fun main() {
    var myFun: (Int, Int) -> Int = fun(a: Int, b: Int): Int {
        return a + b
    }
    println(myFun(3, 5)) // 列印: 8
}

2 尾隨 Lambda 表示式

​ 當一個函式的最後一個引數是函式型別引數時,可以使用尾隨 Lambda 表示式。

2.1 無參函式

fun main() {
    outFun {
        println("inFun") // 列印: inFun
    }
}

fun outFun(inFun: () -> Unit) {
    inFun()
}

2.2 有參函式

fun main() {
    outFun { a ->
        println(a) // 列印: abc
    }
}

fun outFun(inFun: (String) -> Unit) {
    inFun("abc")
}

​ 當只有一個引數時,可以使用 it 簡化 Lambda 表示式,如下。

fun main() {
    outFun {
        println(it) // 列印: abc
    }
}

fun outFun(inFun: (String) -> Unit) {
    inFun("abc")
}

2.3 有返回值函式

fun main() {
    outFun { a, b ->
        a * b // 列印: 15
    }
}

fun outFun(inFun: (Int, Int) -> Int) {
    println(inFun(3, 5))
}

2.4 外層函式有多個引數

1)尾隨函式型別

fun main() {
    outFun("abc") {
        println("inFun")
    }
}

fun outFun(a: String, inFun: () -> Unit) {
    inFun() // 列印: inFun
    println("outFun, $a") // 列印: outFun, abc
}

​ 說明:當外層函式的最後一個引數是函式型別時,可以將 {} 提到 () 外面,該語法稱為“尾隨 Lambda 表示式”。

2)非尾隨函式型別

fun main() {
    outFun({
        println("inFun")
    }, "abc")
}

fun outFun(inFun: () -> Unit, a: String) {
    inFun() // 列印: inFun
    println("outFun, $a") // 列印: outFun, abc
}

​ 說明:當外層函式的最後一個引數不是函式型別,前面的某個引數是函式型別時,必須將 {} 寫到 () 裡面。

3 return 使用

​ Lambda 表示式中,不能直接使用 return 語句返回,需要結合標籤一起使用,否則會編譯報錯(行內函數除外,詳見 → 函式)。

3.1 無返回值函式

fun main() {
    var myFun: (Int) -> Unit = xxx@{
        if (it == 3) {
            println("return xxx")
            return@xxx
        }
        println("end, $it")
    }
    myFun(3) // 列印: return xxx
    myFun(5) // 列印: end, 5
}

3.2 有返回值函式

fun main() {
    var myFun: (Int) -> String = xxx@{
        if (it == 3) {
            return@xxx "test1, $it"
        }
        return@xxx "test2, $it"
    }
    println(myFun(3)) // 列印: test1, 3
    println(myFun(5)) // 列印: test2, 5
}

3.3 尾隨函式

​ 尾隨 Lambda 表示式中,可以使用外層函式的名字作為 return 的標籤名,也可以在 {} 前面自定義標籤名。

fun main() {
    outFun {
        if (it == 3) {
            println("inFun, return")
            return@outFun
        }
        println("inFun")
    }
}

fun outFun(inFun: (Int) -> Unit) {
    inFun(3) // 列印: inFun, return
}

​ 宣告:本文轉自【Kotlin】Lambda表示式

相關文章