Kotlin实现多函数接口的简化调用

对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的。可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法。在java中也有简化接口调用的方式,比如安卓中ViewPager监听页面切换时的接口PageChangeListener,官方提供了简单类: ViewPager.SimpleOnPageChangeListener来简化调用。

对于Kotlin来说,可以类似使用java的方式,来实现多函数接口的简化调用,只是要用到object关键字且代码仍会较多。这里,由于Kotlin的语法更为灵活,去实现这种调用应该有其特色的方式,使得代码更少,且更加具有张力。

来个小例子,先简单介绍类似java实现多函数接口的简化调用,一是展示什么是简化接口调用,二是做对比。这里得例子都用kotlin写的。

  • 1.声明接口CallBack 和调用类Worker
interface CallBack {
    fun onSuccess(str: String)
    fun onFailure(code: Int)
}
class Worker {
    var callback: CallBack? = null
    fun done(str: String) {
        callback?.onSuccess(str)
    }

    fun fail(code: Int) {
        callback?.onFailure(code)
    }

    fun setCallBack(lis: CallBack) {
        callback = lis;
    }
}
  • 2.直接调用接口,使用了object关键字 ,此时假设不关心success方法,但必须显示声明。
 Worker().apply {
         setCallBack(object : CallBack {
           override fun onSuccess(str: String) {
           }
           override fun onFailure(code: Int) {
                toast("$code")
           }
        })
    }.fail(110)
//结果:吐司:110
  • 3.Java风格简化调用,声明简化类SimCallBack
public class SimCallBack implements CallBack{
    @Override
    public void onSuccess(@NotNull String str) {
    }
    @Override
    public void onFailure(int code) {
    }
}
  • 4.Java风格简化调用的展示,不关心的onSuccess不用再显示声明
Worker().apply {
        setCallBack(object : SimCallBack() {
          override fun onFailure(code: Int) {
               super.onFailure(code)
               toast("$code")
          }
        })
}.fail(110)
上述带着浓浓java味道的调用,不仅代码风格比较混杂,而且代码显得冗余。重点来了,Kotlin怎么去克服上面两点呢。看例子。
  • 1.还是CallBack接口,不过其简化类需要用Kotlin风格来做:
class SimpleCallBack : CallBack{
    private var _OnSucess: ((str: String) -> Unit)? = null
    fun success(listener: (str: String) -> Unit) {
        _OnSucess = listener
    }
    override fun onSuccess(str: String) {
        _OnSucess?.invoke(str)
    }
    private var _OnFailure: ((code: Int) -> Unit)? = null
    override fun onFailure(code: Int) {
        _OnFailure?.invoke(code)
    }
    fun fail(listener: (code: Int) -> Unit) {
        _OnFailure = listener
    }
}

声明了两个函数类型变量 _OnSucess和 _OnFailure,作用就是内部将原来的大接口CallBack分解。然后声明了对应的方法success和fail,目的是给变量小接口赋值。接着就是原接口方法的处理,比如原接口方法onSuccess(str: String)的操作 _OnSucess?.invoke(str),目的是实现接口回调结果的转移。做这些,目的就是为以后的简化调用做准备。

  • 2.调用类Worker 也是要进行处理一下的,代码基本同原来的那些,只是增加了以下方法。注意,若不是为了兼容java方式,原setCallBack可以不再声明,直接赋值就好,由此,新增方法可以看做是原setCallBack方法的替换。
 fun setCallBacker(listener: SimpleCallBack.() -> Unit) {
        var ca = SimpleCallBack()
        ca.listener()
        setCallBack(ca)
  }

注意名称。本方法接受一个函数参数,方法的作用是内部生成一个简化接口对象SimpleCallBack,然后再让调用类注册到接口。然后执行传进来的函数参数,为什么要这样呢,是为了使用kotlin语法中灵活的闭包{}。另外,配上强大的函数扩展语法,不改变原有类,增加个这种方法还是比较容易的。

  • 3.最后看看调用方式吧:
 Worker().apply {
        setCallBacker {
            success { toast(it) }
            fail { }//若不需要,可以不显示声明
        }
 }.done("完成")
//结果:吐司:完成

最后结果可以看出,当调用多函数接口CallBack时,并不需要再声明接口,而是直接在闭包里声明想要使用的方法,然后在对应的方法闭包里执行操作即可。风格完全是kotlin,且使用特别简便。

分享结束,希望对读者有所帮助。

作者刘咸尚

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kotlin中,高阶函数可以用于实现回调。所谓高阶函数,就是可以接受一个或多个函数作为参数,或者返回一个函数函数。通过使用高阶函数,我们可以简化回调的实现方式。 具体来说,我们可以将一个函数作为参数传递给另一个函数,然后在需要的时候调用传递进来的函数。这样可以让我们的代码更加简洁、灵活,并且减少了冗余的代码。 在使用Kotlin的高阶函数实现回调时,可以使用Lambda表达式来定义匿名函数,从而更加简化代码。Lambda表达式可以通过大括号 {} 来定义,可以在其中编写函数实现逻辑。 另外,为了方便在Java中调用Kotlin的高阶函数Kotlin提供了一系列Function接口类,最多支持22个参数。这些接口类可以用于定义函数类型,以便在Java中使用高阶函数时进行类型匹配。 总之,通过使用Kotlin的高阶函数,我们可以简化回调的实现方式,使代码更加简洁、易读和灵活。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Kotlin 使用高阶函数实现回调](https://blog.csdn.net/u011494285/article/details/80546335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Kotlin使用高阶函数实现多方法回调](https://blog.csdn.net/Heijinbaitu/article/details/100742964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值