Kotlin进阶-高阶函数进阶演变之路

本文深入探讨Kotlin的高阶函数、扩展函数、SamType以及DSL的实现。通过实例展示了如何从扩展函数到高阶函数、再到SamType的演变,并通过复杂的高阶扩展函数和DSL改造实现优雅的回调逻辑。强调了高阶函数作为基石的重要性,以及理解不同定义方式的逻辑执行顺序对于阅读和编写代码的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

很多同学刚接触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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值