Kotlin安卓称王?Java如何调用Kotlin的高级特性?_android kt context class

本文介绍了Java如何调用Kotlin的高级特性,包括SAM方式、高阶扩展函数和DSL。Java可以通过转换为Function接口调用Kotlin的SAM接口,对于高阶扩展函数,Java需注意参数类型。对于DSL,Java需要手动实现回调接口。至于协程,Java可通过Kotlin中间层间接实现。
摘要由CSDN通过智能技术生成
五、Java调用KT的SAM方式

其实Sam是基于Kotlin的简化方式,对应Java调用Kotlin来说其实是一样的,它只适应于Kotlin。

比如:

 interface MyCustomCallback {

    fun onCallback()
}


fun interface MyCustomCallback {

    fun onCallback()
}


    fun setSamMethod(callback: MyCustomCallback) {

        callback.onCallback()
    }

在Java中是一样的调用

    public void demo5(View view) {

        KotlinDemo demo = new KotlinDemo();

        demo.setSamMethod(new MyCustomCallback() {
            @Override
            public void onCallback() {
                YYLogUtils.w("回调到了");
            }
        });
    }

只是在Kotlin语言中new的方式不同罢了:

    fun setValueCallback2(block: MyCustomCallback.() -> Unit) {

        block(object : MyCustomCallback {
            override fun onCallback() {
                YYLogUtils.w("对方调用了,然后我来继续执行")
            }
        })

    }


    fun setValueCallback2(block: MyCustomCallback.() -> Unit) {

        block(MyCustomCallback { YYLogUtils.w("对方调用了,然后我来继续执行") })

    }

其实是和高阶函数的调用比较类似,只是一个是我们自己定义的接口,一个是高阶函数Java转换的Function接口,使用起来是一样的。

六、Java调用KT高阶扩展函数

什么叫高阶扩展函数,其实就高阶函数,只是把原本回调的对象类型放在了前面以扩展的方式表达。以扩展的方式定义高阶函数,我把它叫做高阶扩展函数,但其本质还是高阶函数。

举一个很简单的例子

fun String.setValueCallback11(block: Industry.(Int) -> Unit) {
    block(Industry(0, this, "123", "456"), 10)
}

fun String.setValueCallback12(block: (Industry, Int) -> Unit) {
    block(Industry(0, this, "123", "456"), 10)
}

前者是高阶扩展函数,后者是高阶函数,使用的方式是一样的,只是高阶函数回调的时候一个需要用it或者指定变量接收,而高阶扩展函数只需要this接收,并且高阶扩展函数默认在回调的第一个参数上。

例如:

    "test".setValueCallback11 { int ->
        YYLogUtils.w("收到回调:industry:" + this.toString() + " int:" + int)
    }

    "test".setValueCallback12 { industry, int ->
        YYLogUtils.w("收到回调:industry:" + industry.toString() + " int:" + int)
    }

一个直接用this,另一种需要用it或者自定义名称来接收。用起来都是一样的,只是使用高阶扩展函数的话,会有一些简写方式更加方便,(如果不懂的话可能会更懵吧)

如何定义高阶扩展函数

这种方式有几种定义方式,以函数的类型定义为扩展函数定义和非扩展函数定义。参数又分基本类型,自定义类型,与接口类型。

下面都会讲到,先从简单的常用的讲起。

基本数据类型:

    //这种比较常见
    fun String.setValueCallback(block: String.() -> Unit) {

        block(this.length.toString())
    }


    demo.setValueCallback("test", new Function1<String, Unit>() {
        @Override
        public Unit invoke(String s) {
            YYLogUtils.w("看看我收到的什么:" + s);
            return null;
        }
    });

使用扩展方法再加上高阶扩展函数的参数,我们就可以直接使用this。就可以直接拿到数据设置回调。

这样的方式主要用于直接回调给对方

打印结果:

自定义对象类型:

如果我们修改高阶扩展函数的对

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值