【Kotlin】Lambda表达式

1 常规调用

Lambda 表达式总结 中对 Java 的 Lambda 表达式进行了总结,本文将对 Kotlin 中的 Lambda 表达式进行总结。

1.1 无参函数

Kotlin 复制代码
fun main() {
    var myFun: () -> Unit = {
        println("test")
    }
    myFun() // 打印: test
}

以上代码等价于:

Kotlin 复制代码
fun main() {
    var myFun: () -> Unit = fun() {
        println("test")
    }
    myFun() // 打印: test
}

1.2 有参函数

Kotlin 复制代码
fun main() {
    var myFun: (String) -> Unit = { a ->
        println("test, $a")
    }
    myFun("abc") // 打印: test, abc
}

以上代码等价于:

Kotlin 复制代码
fun main() {
    var myFun: (String) -> Unit = fun(a: String) {
        println("test, $a")
    }
    myFun("abc") // 打印: test, abc
}

当只有一个参数时,可以使用 it 简化 Lambda 表达式,如下。

Kotlin 复制代码
fun main() {
    var myFun: (String) -> Unit = {
        println("test, $it")
    }
    myFun("abc") // 打印: test, abc
}

如果不使用某个参数,可以使用下划线(_)简化,如下。

Kotlin 复制代码
fun main() {
    var myFun: (Int, Int) -> Unit = { _, b ->
        println("test, $b")
    }
    myFun(3, 5) // 打印: test, 5
}

1.3 有返回值函数

Lambda 表达式中最后一行将作为返回值返回。

Kotlin 复制代码
fun main() {
    var myFun: (Int, Int) -> Int = { a, b ->
        a + b
    }
    println(myFun(3, 5)) // 打印: 8
}

以上代码等价于:

Kotlin 复制代码
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 无参函数

Kotlin 复制代码
fun main() {
    outFun {
        println("inFun") // 打印: inFun
    }
}

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

2.2 有参函数

Kotlin 复制代码
fun main() {
    outFun { a ->
        println(a) // 打印: abc
    }
}

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

当只有一个参数时,可以使用 it 简化 Lambda 表达式,如下。

Kotlin 复制代码
fun main() {
    outFun {
        println(it) // 打印: abc
    }
}

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

2.3 有返回值函数

Kotlin 复制代码
fun main() {
    outFun { a, b ->
        a * b // 打印: 15
    }
}

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

2.4 外层函数有多个参数

1)尾随函数类型

Kotlin 复制代码
fun main() {
    outFun("abc") {
        println("inFun")
    }
}

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

说明:当外层函数的最后一个参数是函数类型时,可以将 {} 提到 () 外面,该语法称为"尾随 Lambda 表达式"。

2)非尾随函数类型

Kotlin 复制代码
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 无返回值函数

Kotlin 复制代码
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 有返回值函数

Kotlin 复制代码
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 的标签名,也可以在 {} 前面自定义标签名。

Kotlin 复制代码
fun main() {
    outFun {
        if (it == 3) {
            println("inFun, return")
            return@outFun
        }
        println("inFun")
    }
}

fun outFun(inFun: (Int) -> Unit) {
    inFun(3) // 打印: inFun, return
}
相关推荐
pengyu3 小时前
【Kotlin 协程修仙录 · 金丹境 · 后阶】 | 异常防火墙:supervisorScope 与异常隔离的终极奥义
android·kotlin
夏沫琅琊4 小时前
Jetpack Compose + 原生 PDF API 从零搭一个 Android 工具应用 (一)
android·pdf·kotlin
疏狂难除18 小时前
JetBrains IDE插件开发教程(五)——File Header
ide·kotlin
Kapaseker1 天前
Android CLI 完全指南
android·kotlin
Coffeeee2 天前
Android功耗优化,哪些代码会让你的机子发热又耗电
android·架构·kotlin
Android打工仔2 天前
Kotlin 编译器是如何把 suspend 函数变成状态机的?
kotlin
Android打工仔2 天前
一个 suspend 函数,为什么会变成一个普通函数?
kotlin
苦瓜花3 天前
【Kotlin】初入门
android·开发语言·kotlin
Kapaseker3 天前
Rust 是如何处理异常的
rust·kotlin
冬日砥砺前行3 天前
Kotlin 协程:几个曾经被我误解的点
kotlin