在Kotlin中可以传递一个Lambda代替OnClickListener实例:
button.setOnClickListener { view -> ... }
这种方式可以工作的原因是OnClickListener接口只有一个抽象方法。这种接口被称为函数式接口或者SAM接口,SAM代表单抽象方法。
1.1、把lambda当做参数传递给Java方法
1.2、SAM构造方法:显示地把lambda转换成函数式接口
SAM构造方法 是编译器生成的函数,让你执行从labmbda到函数式接口实例的显示转换。可以在编译器不会自动应用转换的上下文中使用它。
使用SAM构造方法返回值
fun createAllDoneRunnable():Runnable{
return Runnable { println("All done !") }
}
createAllDoneRunnable().run()
SAM构造方法的名称和底层函数式接口的名称一样。SAM构造方法只接收一个参数——一个呗用作函数式接口单抽象方法体的lambda——并返回实现了这个接口的累的一个实例。
SAM构造方法把lambda生成的函数是接口实例存储在一个变量。
val listener=OnClickListenner{ view->
val text =when(view.id){
R.id.button1->"First button"
R.id.button2->"Second Button"
else->"Unknow button"
}
toast(text)
}
button1.setOnClickListener(listener)
button2.setOnClickListener(listener)
ps:看完真的是一脸蒙蔽。
网友评论