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

以上就完成了一个DSL的改装,完美运行,当然这是接口有多个实现函数可以这么搞,如果接口只有一个函数我们可以选择直接使用高阶函数,或者使用SamType的方式定义都可以,完全就不需要这么麻烦的定义DSL了。可以看到其实高阶函数才是这些功能的基石,也是相比Java代码更方便的一个点,大家使用的时候一定要掌握的就是高阶函数这个点。多个函数就不能使用Sam的方式来修饰接口了,但是我们使用的是高阶函数类型,所以是可以直接使用{}的。可以实现一样的效果,只是使用回调的时候,一个是it 一个是this。
摘要由CSDN通过智能技术生成

前言

很多同学刚接触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 =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值