美文网首页Kotlin
Kotlin中的Lambda

Kotlin中的Lambda

作者: 光羽隼 | 来源:发表于2017-11-02 11:32 被阅读0次

    Lambda表达式是一种定义匿名函数的简单方法。Lambda可以避免我们写一些包含了某些函数的抽象类或者接口,然后在类里面实现他们。在kotlin中我们可以把一个函数作为另一个函数的参数。
    如果我们想在一个ListView中的item添加某种点击事件,就需要在对应的adapter中添加点击事件的接口,并在activity中实现并回调。
    普通的写法:
    接口:

     interface OnClickListener {
    fun onClick(View v);
    }
    

    匿名内部类实现接口

    view.setOnClickListener(object : OnClickListener {
       override fun onClick(v: View) {
           toast("Click")
         }
    }
    

    在kotlin中,interface中包含单个函数可以被替换为一个函数。
    我们可以这样定义adapter:

    fun setOnClickListener( val listener: (View) -> Unit)
    

    一个lambda表达式val listener: (View) -> Unit通过参数的形式被定义在箭头的左边(被小括号包围),然后在箭头右边返回结果值。在上边的例子中,我们接收一个实例类View,然后返回一个Unit(没有东西)。
    val listener: (View) -> Unit
    就相当于一个单方法的接口,那么我们就可以使用这个替换接口。

    所以我们调用方法的时候可以将代码简化成这样:

    view.setOnClickListener({ view -> toast("Click")})
    

    这样使用,代码确实简化了,当我们定义了一个方法,我们必须是用大括号包围,然后在大括号左边指定参数,在箭头右边返回函数执行的结果,如果左边的参数没有使用到,我们甚至可以省略左边的参数:

    view.setOnClickListener({ toast("Click") })
    

    如果这个函数的最后一个参数是一个函数,那么我们可以那这个函数移动到括号外边:

    view.setOnClickListener() { toast("Click") }
    

    如果这个函数是最后一个参数的话,我们甚至可以省略这个圆括号:
    view.setOnClickListener { toast("Click") }

    如果这个函数只接受一个参数,但是这个参数需要在函数中使用到,我们能不能将这个参数省略呢?
    当然可以:

    val adapter = ForecastListAdapter(result) { forecast -> toast(fo
    recast.date) }
    

    可以省略forecast这个参数,我们可以使用it引用参数,而不用指定箭头左边的参数。

    val adapter = ForecastListAdapter(result) { toast(it.date) }
    

    相关文章

      网友评论

        本文标题:Kotlin中的Lambda

        本文链接:https://www.haomeiwen.com/subject/tlkopxtx.html