Java程序员学Kotlin的一些小记录(1):java和kotlin方法互调小思考

本文探讨了Kotlin如何允许函数作为参数传递,而Java则需要通过实现接口来达到类似效果。然而,在Java和Kotlin互调时,Kotlin中的函数参数可以接受Java的Lambda表达式。详细解析了Java如何使用Lambda表达式调用Kotlin的函数,并展示了等价的传统接口实现方式。文章最后总结,尽管语言特性不同,但Kotlin已为Java互调提供了兼容解决方案。
摘要由CSDN通过智能技术生成

Kotlin的函数的参数可以直接传递方法,Java不能,需要通过定义接口,用接口的方式传递。

但是Java和Kotlin又可以互调,那如果我们再kotlin的类中定义一个需要参数传方法的函数,然后java去调用它这个函数,会以怎么样的形式传给它呢?

我们在kotlin文件中定义一个函数,这个函数需要传递一个字符串和一个方法,这个方法需要传递两个数字,并且返回一个数字:(为方便调用声明为object,相当于java里面的静态类吧,里面的方法都是可直接访问)

object TestKotlin{

    fun testKotlin(testStr:String,testFunReturnStr:(Int,Int)-> Int) : String{
        return testStr + testFunReturnStr(1,2)
    }

}

我们在另一个kotlin文件中调用这个方法:

//先提供一个方法待会作为参数传递
private fun testFunAdd(one:Int, two:Int):Int{
        return one + two
}

//然后调用第一步那里写的测试方法
var re = TestKotlin.testKotlin("加法得到:",this::testFunAdd)

输出的这个re结果就是:

加法得到:3

 

我们发现其实这个传递方法this::testFunAdd不就是java1.8里面那个landau表达式嘛,是的,我们java里面也可以这么传:

//提供一个方法待会传递
public int javaFun(int one, int two) {
        return one + two;
}

//然后调用kotlin里面的方法:
TestKotlin.INSTANCE.testKotlin("加法得到:", this::javaFun)

但是我们使用landau表达式是知道它具体什么匿名内部类转换过来的,这个我们不知道,所以就取消这种方式,自己探索原表达式应该是怎么样的:

TestKotlin.INSTANCE.testKotlin("加法得到:",fun);

这个fun我不知道什么类型,所以先定义一个变量名称,然后通过代码提示自动生成一个变量声明:

Function2<? super Integer, ? super Integer, Integer> fun;
TestKotlin.INSTANCE.testKotlin("加法得到:",fun);

是一个叫做Function2的对象,那这个Function2怎么实现呢?按照我们没有对象就new一个对象的思路,我们给它new一下:

Function2<? super Integer, ? super Integer, Integer> fun = new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer invoke(Integer integer, Integer integer2) {
                
            }
        };

这样一看就很明了了,我们就是实现这个invoke方法就相当于是传过去的方法:

Function2<? super Integer, ? super Integer, Integer> fun = new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer invoke(Integer integer, Integer integer2) {
                return integer + integer2;
            }
        };

结论:

实际上,这么个传递方式其实也就是java里面的实现接口方式:

我们追进Function2源码去,可以看到是kotlin定义的根据参数个数从Function0到Function22的接口。

 

其他类似的哪一边特有的我觉得kotlin在设计之初也都考虑好了,既然可以互调那肯定是会给我们提供对应的解决方案。

完。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值