最近在做项目的时候,发现很多代码都是复用的,这样不封装的话显得代码台臃肿,所以用到了kotlin的高阶函数来进行封装,这样代码很简介:
例如有如下的需求:
在一个闪屏页面进入的时候判断是否需要登陆,点击跳过倒计时进入与时间到了自动进入的唯一区别就是,点击跳过倒计时进入需要关闭handler来防止重复进入。
关闭handler方法已经写好,像下边这样调用即可:
countdown.stop()
我们可以写一个包级方法如下,通过uid是否为空来进行是否跳转到登陆界面:
fun splashToLogin(method:() -> Unit, context: Activity, uid:String?) {
method()
if(uid.isNullOrEmpty().not())context.startActivity<MainActivity()els e context.startActivity<LoginPasswordActivity>()
context.finish()
}
可以看出其中传了三个参数,最后两个不用解释,第一个参数表示传递的是一个函数,并且这个函数没有参数,也没有返回值,方法里面是通过uid是否为空来进行跳转判断,并执行了method函数。
在其他地方调用的方式如下:
//倒计时完毕自动进入
countdown.setOnFinishAction {
splashLogin({}, this, uid)
}
//点击跳过倒计时进入,并且关闭handler发送
countdown.setOnClickListener {
splashLogin({ countdown.stop() }, this, uid)
}
拓展:
kotlin强大的函数当参数传入还可以更简介的优化代码
例如:我们需要调用一个方法,并且向里面传一个int类型的值,然后经过一系列操作得到一个string类型的值。在包级方法中可以这样写:
fun funOne(method: (t:Int) -> String,x: Int):String{
return method(x)
}
其中method函数就是一些列的变化操作,x就是我们传入的那个int值,最后返回一个string类型的值。
调用的地方这样写到:
funOne({"传入的int转换为string的结果为: $it"},1)
上边是lambda表达式的形式,其实还可以用kotlin中的双冒号引用方式进行调用:
funOne(this::method,1)
fun method(i:Int):String{
return "传入的int转换为string的结果为: $i"
}
这就相当于 我把1传进去,然后经过一个方法的一些列操作达到我们需要的值,这就是kotlin的强大之处,当然高阶函数并非这么简单,还有更多有意思的操作,后面遇到了再来更新。
网友评论