先看一段代码:
fun main(args: Array<String>) {
val sum = { a: Int, b: Int -> a + b }
println(sum)
println(sum(1, 2))
println({ a: Int, b: Int -> a + b }(3, 4))
println({ a: Int, b: Int -> a + b })
}
看输出:
Function2<java.lang.Integer, java.lang.Integer, java.lang.Integer>
3
7
Function2<java.lang.Integer, java.lang.Integer, java.lang.Integer>
Process finished with exit code 0
可以看出在 kotlin
的 lambda 的基本语法 ,由大括号开始于结束,然后前面是参数,后面是对参数的使用,返回值就是计算结果。
与 Python 中的 lambda 很类似,不过似乎更精简。
看看系统中实现的一些 lambda :
listOf(Candy(1), Candy(3), Candy(2),
Candy(9), Candy(6))
.maxBy { it.price }
.run {
println("run $this")
this
}
.also {
println("also $it")
}
.apply {
println("apply $this")
}
.let {
println("let $it")
}
一看就懂,就是找出最大值,然后直接打印出来。
rxJava 中 可以实现类似的效果,不过 kotlin 可以不使用第三方库实现。Java8 中也可以(应该是通过Stream 去操作)。
再看一段代码:
fun main(args: Array<String>) {
println(
{ a: Int, b: Int ->
println("$a+$b -> ${a + b}")
a + b
}
)
// 两次 print
println(
{ a: Int, b: Int ->
println("$a+$b -> ${a + b}")
a + b
}
(29, 48)
)
}
第一次的输出是一个 类型, 第二次 先执行了自己的打印,然后是外部的打印。
这里可以看出 lambda 不仅仅可以执行一行的计算,也可以是多行的,只是最后一行才是返回值。
关于 kotlin 的 lambda ,内部实现还不是很了解。有待深入。