kotlin中的lambda表达式

kotlin中的lambda表达式

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的时候,个人觉得需要记录下来的地方,有需要的朋友,也可以作为参考!

你可能感兴趣的:(kotlin)