【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
}
相关推荐
zhangphil15 小时前
Android Glide load origin Bitmap, Kotlin
android·kotlin·glide
老码沉思录1 天前
Android开发实战班 - Android开发基础之 Kotlin语言基础与特性
android·微信·kotlin
易我数据恢复大师2 天前
怎么只提取视频中的声音?从视频中提取纯音频技巧
it·视频·人声分离·音频提取
闲暇部落2 天前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
长亭外的少年3 天前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
JIAY_WX3 天前
kotlin
开发语言·kotlin
麦田里的守望者江3 天前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
菠菠萝宝4 天前
【YOLOv8】安卓端部署-1-项目介绍
android·java·c++·yolo·目标检测·目标跟踪·kotlin
恋猫de小郭4 天前
Kotlin Multiplatform 未来将采用基于 JetBrains Fleet 定制的独立 IDE
开发语言·ide·kotlin
枫__________4 天前
kotlin 协程 job的cancel与cancelAndJoin区别
android·开发语言·kotlin