Kotlin中使用高阶函数代替接口回调

本文介绍如何使用Kotlin实现监听器,包括接口方式和高阶函数方式,并对比Java实现,展示更简洁高效的代码风格。
部署运行你感兴趣的模型镜像

Java思路实现

  1. 创建接口,创建对应抽象方法
  2. 声明接口成员变量
  3. 创建一个公共的监听方法
  interface OnDialogClickListener{
        fun onClickOK()
    }

    private var onDialogClickListener: OnDialogClickListener?=null

    fun setOnDialogClickLister(onDialogClickListener:OnDialogClickListener){
        this.onDialogClickListener = onDialogClickListener
    }

4.在对应的地方调用接口方法

       R.id.btn_ok ->{
                onDialogClickListener?.onClickOK()
            }

5.使用

       val phoneCodePopView = PhoneCodePopView(this)
        phoneCodePopView.setOnDialogClickLister(object :PhoneCodePopView.OnDialogClickListener{
            override fun onClickOK() {
                
            }

        })

总的来说实现思路不是很难,按照java的方式一下就可以写出来,但是发现使用的时候不能使用lambda表达式,从而代码不够简洁,会有大量的匿名内部类

Kotlin高阶函数实现

高阶函数指的是函数中存在函数为参数或返回体的函数,这里相比Java就有点难理解了,不过,记住概念,会使用不会很难

1.声明成员变量,类型为函数类型
2.创建一个公共的监听方法

   //声明变量,类型为一个函数
    private var onClickOkListener: (() -> Unit)?=null

    //添加一个监听方法,参数同样是一个函数,类型与onClickOkListener保持一致
    fun setOnClickListener(listener: (() -> Unit)?){
        this.onClickOkListener = listener
    }
  1. () -> Unit作为一个函数声明,无参,Unit表示无返回值
  2. (() -> Unit)?=null 表示此声明的变量可为null
  3. 如果想声明带参数,有返回体的函数可以这么声明
    (age:Int,name:String) -> String,注意形参可省略,那可以直接写成(Int,String) -> String

3.在对应的地方调用

   R.id.btn_ok ->{
                onClickOkListener?.invoke()
           }

直接用声明的函数变量调用invoke()方法,这里的还可以写成onClickOkListener!!(),因为onClickOkListener本身就是一个函数,但这样假如onClickOkListener为null就会异常,所以最好直接onClickOkListener?.invoke(),如果为null就不会执行invoke方法。另外有参数,直接在invoke()方法传入参数

5.使用

  val phoneCodePopView = PhoneCodePopView(this)
        phoneCodePopView.setOnClickListener { 
            
        }

多个回调方法

    private var onClickOkListener:((code:String)->Unit)?= null
    private var onClickCancelListener:(()->Unit)?= null
    private var onResetCodeListener:(()->Unit)?= null


    fun setOnDialogClickListener(onClickOk:((code:String)->Unit)?,
                                 onClickCancel:(()->Unit)?=null,
                                 onResetCode:(()->Unit)?=null
                                 ): SmsDialog? {
        this.onClickOkListener = onClickOk
        this.onClickCancelListener = onClickCancel
        this.onResetCodeListener = onResetCode
        return this
    }

大致原理是一样的,你也可以把这拆分为三个监听方法,在一个里面也行

使用

       smsDialog = SmsDialog(this)
        smsDialog!!.setOnDialogClickListener(onClickOk = {code->
            //code 去获取验证码
            mViewModel.doGetMsgCode(code)
        })

注意这里可以指定监听回调具体的某一个函数,通过对应的函数名 ={}就可以了

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值