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) }
网友评论