【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
}
相关推荐
五味香20 小时前
Java学习,List截取
android·java·开发语言·python·学习·golang·kotlin
xvch1 天前
Kotlin 2.1.0 入门教程(三)
android·kotlin
小李飞飞砖1 天前
kotlin的协程的基础概念
开发语言·前端·kotlin
深色風信子2 天前
Kotlin Bytedeco OpenCV 图像图像49 仿射变换 图像裁剪
opencv·kotlin·javacpp·bytedeco·仿射变换 图像裁剪
五味香2 天前
Java学习,List移动元素
android·java·开发语言·python·学习·kotlin·list
studyForMokey3 天前
【Android学习】Kotlin随笔
android·学习·kotlin
zhangphil3 天前
Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin
android·kotlin
柯南二号4 天前
【Kotlin】上手学习之控制流程篇
android·开发语言·学习·kotlin
划水哥~4 天前
Kotlin数据类
开发语言·kotlin
深色風信子5 天前
Kotlin Bytedeco OpenCV 图像图像55 图像透视变换
opencv·kotlin·透视变换·bytedeco