前言
很多同学刚接触Kotlin,或者一直以Java的方式写Kotlin,对Kotlin中的 高阶函数,扩展函数,高阶扩展函数,SamType, DSL
的一些写法不熟悉。这里以一个例子来说明一下如何进阶演变。
一、扩展函数
Kotlin中的扩展函数特性让我们的代码变得更加简单和整洁,它可以减少很多的样板代码,大大提高开发的效率。
我们常用的就是定义在顶层的扩展函数,如:
fun Any.toast(msg: String?) {
ToastUtils.makeText(CommUtils.getContext(), msg)
}
虽然用的最多的都是顶层的扩展函数,但是扩展函数还是能限定作用域
fun String.foo() {
YYLogUtils.w("扩展函数 foo1")
}
class TestNet {
fun String.foo() {
YYLogUtils.w("扩展函数 foo2")
}
}
那么在类部使用和类外使用调用的是不同的方法。
除了扩展函数,我们还能扩展类的属性:
val TestNet.no: Int get() = 1 //扩展成员变量
class TestNet {}
使用的时候,可以打印对象的属性了:
val testNet = TestNet()
YYLogUtils.w("no:" + testNet.no)
扩展函数相信大家都很熟悉,我就简单的介绍一下,下面看看高阶函数。
二、高阶函数
听起来挺唬人,其实就可以理解为一个参数类型,之前Java的参数都是基本类和类型,不能把函数当参数,最多就是使用接口当参数。
Kotlin支持把函数当做参数类型,看看如何定义:
fun requestNetwork(
onCancel: () -> Unit, //空参和空返回值
onFinished: ((Boolean) -> Boolean)? = null, //带参数带返回值
onFailed: (FailedCallback) -> Unit //使用带参数的高阶函数的方式
)
高阶函数在Kotlin中可以说是代替了接口的回调
val callback: (Int, String) -> Unit = { int, str ->
toast("int : $int ; str: $str")
}
//启动Fragment
start(Demo11OneFragment2(callback))
另一边就可以通过这个callback回调给当前页面
class Demo11OneFragment2(private val _callback: ((Int, String) -> Unit)?) : BaseFragment() {
...
override fun onDestroy() {
super.onDestroy()
//高阶函数回调
_callback?.invoke(10, "返回给One Page的数据")
}
}
下面我们通过一个例子来说明高阶函数与扩展函数的结合:
class TestNet {
fun requestNetwork(
onCancel: () -> Unit, //空参和空返回值
onLoading: ((isShowLoading: Boolean) -> Boolean)? = null, //带参数带返回值
onSuccess: SuccessCallback,
onFailed: FailedCallback
) {
MainScope().launch {
onLoading?.invoke(true)
val result = withContext(Dispatchers.IO) {
delay(1500)
return@withContext Random(10).nextLong()
}
when {
result > 8 -> {
onCancel()
}
result > 5 -> {
onSuccess.onSuccess()
}
else -> {
onFailed.onFailed()
}
}
}
}
interface SuccessCallback {
fun onSuccess()
}
interface FailedCallback {
fun onFailed()
}
}
很简单的例子,模拟网络请求,通过不同的值回调不同的函数。
看看如何接收回调:
TestNet().reques