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"); } })
二、自定义回调函数
在 java 中我们一般的做法是这样的
- 定义一个接口
- 定义一个接口类型变量
- 定义一个 set 方法
- 调用 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(){ mListener.onCheck("完成") } ... }
设置接口的实现类
// 调用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(){ mListener.onCheck("完成") } ... }
设置接口的实现类
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; } });
下一篇:
Mysql 把某一列字段按照逗号分割