kotlon中的Lambdas
2017-07-10 本文已影响0人
Dreamboy_a2ef
Lambda表达式是一种很简单的方法,去定义一个匿名函数。Lambda是非常有用
的,因为它们避免我们去写一些包含了某些函数的抽象类或者接口,然后在类中去
实现它们。在Kotlin,我们把一个函数作为另一个函数的参数。(说了这么多就是想装逼) 直奔主题, 拿 onclick 练练手,先做个对比:
java :
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toast("java")
}
}
kotlin:
button.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
toast("kotlin")
}
})
Lambdas:
button.setOnClickListener{
toast("Lambdas")
}
简洁,这是我想了解Lambdas的主要原因,下面具体介绍一下:
一个lambda表达式通过参数的形式被定义在箭头的左边(被圆括号包围),然后在箭头的右边返回结果值。在这个例子中,我们接收一个View,然后返回一个Unit
fun setOnClickListener(listener : (View)-> Unit)
(Unit 表示没有东西,也可以写要执行的逻辑,比如上面的toast())。所以根据这种思想,我们可以把代码简化成这样(当我们定义了一个方法,我们必须使用大括号包围):
// 在箭头的左边指定参数,在箭头的右边返回函数执行的结果
button.setOnClickListener({listener -> Unit})
如果左边的参数没有使用到,我们甚至可以省略左边的参数:
// 省略左边的函数 为了便于观看,写入一个吐司
button.setOnClickListener({ toast("Lambdas") })
如果这个函数的最后一个参数是一个函数,可以把这个函数移动到圆括号外面:
// 移动函数(即大括号中的东西)
button.setOnClickListener(){ toast("Lambdas") }
并且,最后,如果这个函数只有一个参数,我们可以省略这个圆括号:
// 省略圆括号
button.setOnClickListener{ toast("Lambdas") }
定义一个多个参数的方法:
fun setLambdas(p0 : Int, view : (View)->Unit){}
// 正常调用(最后一个参数是函数,所以可以将大括号挪出圆括号外面)
setLambdas(0){view -> Unit}
// 调用时,最后一个参数View 没有使用
setLambdas(0){}