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() // 打印: inFunprintln("outFun, $a") // 打印: outFun, abc
}
说明:当外层函数的最后一个参数是函数类型时,可以将 {} 提到 () 外面,该语法称为“尾随 Lambda 表达式”。
2)非尾随函数类型
fun main() {outFun({println("inFun")}, "abc")
}fun outFun(inFun: () -> Unit, a: String) {inFun() // 打印: inFunprintln("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 xxxmyFun(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, 3println(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
}