lambda即lambda表达式,简称lambda。本质上是可以传递给其它函数的一小段代码。有了lambda,可以轻松地把通用代码结构抽取成库函数。lambda最常见的用途是和集合一起配合。kotlin甚至还拥有带接收者的lambda,这是一种特殊的lambda;
从某种意义上说的话kotlin中的lambda其实就是匿名函数。
首先看一下kotlin中的匿名函数是什么样子的:
val printName = fun(name: String) = println(name)
val funTest = fun(x: Int, y: Int) = x + y
从上面可以看到,等号右边的是匿名函数,等号左边的是final的常量名称,也就是说匿名函数可以赋值给一个常量或者变量。
然后再来看lambda表达式, 比如实现一个两个数相加的函数,可以这样写:
val sum = {
x: Int, y: Int ->
x + y
}
可以看到lambda的写法格式是这个样子```(参数列表)-> 返回值, 如果以lambda作为函数的参数的话,可以这样写:
fun showTest1(x: (String), funTest: (Int, String) -> Unit){
val name = x
val value = 23
funTest(value, name)
}
调用的时候可以这样调用:
showTest1("ashak"){ v, s ->
println(v)
println(s)
}
比如在kotlin中的循环迭代:
val args = intArrayOf(1, 2, 3, 5)
args.forEach {
println(it)
}
这个forEach的参数就是一个lambda表达式,源码如下:
/**
* Performs the given [action] on each element.
*/
public inline fun IntArray.forEach(action: (Int) -> Unit): Unit {
for (element in this) action(element)
}
可以看到它是一个有一个Int入参没有返回值的lambda表达式;上面的循环迭代的例子其实也可以简化成这样:
args.forEach(::println)
这个双冒号的意思是引用,就是说在lambda中如果想用它的参数作为你调用函数的入参的话,并且在只有一个参数的情况下,可以这样写。
在lambda中如果我想返回并且继续执行下面的代码的时候怎么办呢,其实可以这样写:
args.forEach forEach@{
if(it == 2) return@forEach
println(it)
}
println("end")
代码中的forEach@
表示给这个表达式起个名字,然后return 的时候@一下这个名字就行了,这样的话println("end")
这句就执行到了。
以上这些都是在kotlin中lambda所注意的地方,关于用lambda作为函数的参数,我突然想起了java里面的接口回调, 我们知道java里面,要想监听一个方法里面的部分逻辑的话,就得用接口回调的方式,但是有了kotlin中的lambda表达式,就可以用lambda表达式作为监听回调,这大大简化了代码的编写,而且看上去也很舒服,比如:
fun showTest1(x: (String), funTest: (Int, String) -> Unit){
val name = x
val value = 23
funTest(value, name)
}
调用的时候:
showTest1("ashak"){ v, s ->
println(v)
println(s)
}
以上就是我在学习kotlin的时候,个人觉得需要记录下来的地方,有需要的朋友,也可以作为参考!