<强>λ和高阶函数强>
之前学习了λ和高阶函数,然后在android开发中对> rootView。setOnClickListener{视图→ println(“点击了这个ID=$ {view.id}的视图”) }
然后在开发中不可避免的我们也要写一些自定义监听之类的代码。这个时候如果还用java的思想去实现的话就有点舍近求远了。
<强> java思想实现强>
在java中我们一般的做法是这样的
定义一个接口
定义一个接口类型变量
定义一个集方法
调组用方法设置接口的实现类
<强>用芬兰湾的科特林实现就是如下强>
类MyView {//定义一个接口 接口IOnLabelCheckedListener { 有趣的>//从最基础的开始做,把匿名内部类通过λ实现 MyView。setOnLabelCheckedListener(对象:MyView。IOnLabelCheckedListener { 覆盖乐趣>//这里接收一个上面我们改造好的表达式lam它内部实现应该是把e赋值给当前类的一个对象 乐趣setOnLabelCheckedListener (e:(字符串)→单位){ 这一点。lisenter=e }//显然lisenter就应该是这样的 var linsnter: (String)→单位={}
最后使用linsnter进行回调
私人乐趣initView(背景:背景){ 视图。setOnCheckedChangeListener {radioGroup,我在; linsnter (radioGroup.findViewById(我).text.toString ()) } }
最终代码结果:
类MyView { var linsnter: (String)→单位={} 私人乐趣initView(背景:背景){ 视图。setOnCheckedChangeListener {radioGroup,我在; linsnter (radioGroup.findViewById(我).text.toString ()) } } 乐趣setOnLabelCheckedListener (e:(字符串)→单位){ 这一点。lisenter=e } }//调用时将变量林省略,直接使用一个表达式 视图。setOnLabelCheckedListener{标签→ println(标签) } >之前 最终的代码和之前的代码有两个最大的不同,一是没有了接口定义,二是没有了匿名内部类。
<强>更好的使用高阶函数强>
高阶函数的使用更多的时候能使我们的代码更简洁,比如下面这段代码:
乐趣refreshData (e: ((Boolean、String)→单位):布尔{ 如果(! UserInfoManager.getInstance () .isLogin) { e(假,“未登录”) 返回假 } NETWorkUtils.request (ApiParamter()、对象:ApiListener{ 覆盖乐趣> mView。refreshData {isSuccess,味精→//做某事 } 是不是很简单,省去了再写一个接口。同时如果是用java来调用refreshData方法也一样可以的:
mView。refreshData(新Function2<布尔,字符串,Unit> () { @Override 公共部门调用(布尔aBoolean字符串s) {//做某事 返回null; } });芬兰湾的科特林提供了一系列的函数接口类来供java调用高阶函数时使用,最多支持22个参数有兴趣的可以查看一下。
以上就是在芬兰湾的科特林中使用高阶函数来替代传统的回调函数的方法。不对之处还请指正。希望能给大家一个参考,也希望大家多多支持。
芬兰湾的科特林使用高阶函数实现回调方式