Kotlin⾼级函数实现回调详解
⼀、前⾔
在开发中,我们经常使⽤回调函数,命名往往是各种Callback和Listener。例如最常见的View.OnClickListener
mBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Log.d("MM","Click");
}
});
如果⽤kotlin 来写的话如下
mBtn.setOnClickListener(object:View.OnClickListener{
override fun onClick(v: View?){
Log.d("MM","Click");
}
kotlin 高阶函数})
⼆、⾃定义回调函数
在 java 中我们⼀般的做法是这样的
1. 定义⼀个接⼝
2. 定义⼀个接⼝类型变量
3. 定义⼀个 set ⽅法
4. 调⽤ set ⽅法设置接⼝的实现类
⽤ kotlin 实现就是如下
class MyView{
//定义⼀个接⼝
interface IOnListener {
fun onCheck(str: String)
}
//定义⼀个接⼝类型变量
private var mListener: IOnListener?=null
//定义⼀个 set ⽅法
fun setListener(onListener: IOnListener){
this.mListener = onListener
}
/
/完成⼯作后调⽤接⼝⽅法
fun work(){
}
...
}
设置接⼝的实现类
// 调⽤set⽅法,通过匿名内部类实现
myView.setListener(object: LabelBarView.IOnLabelCheckedListener{
override fun onLabelCheck(str: String){
println(str)
}
})
这样实现太复杂了,刚开始写的时候,觉得都没有java 的lambda表达式简洁,总觉得哪⾥不对。后来发现kotlin实现思想和java的不同。
三、使⽤⾼阶函数来实现
1.单⽅法回调
不需要定义接⼝,只定义⼀个函数变量
class MyView{
lateinit var mListener:(String)-> Unit
fun setListener(listener:(String)-> Unit){
this.mListener = listener
}
fun work(){
}
...
}
设置接⼝的实现类
myView.setListener{ str ->
println(str)
}
如果只有⼀个参数还可以这样
//it代表⼊参 String类
myView.setListeren{println(it)}
如果是⽤ java 来调⽤ setListener ⽅法也⼀样可以的:
mView.setListener(new Function2<String, Unit>(){
@Override
public Unit invoke(String s){
println(s)
return null;
}
});
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论