前言

很多同学刚接触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().requestNetwork(onCancel =

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: