Java与Kotline Funcation函数与参数函数的详解

一.介绍

        在现在以IDE为开发工具的时代,各种开发语言都有,kotlin的语法势头比较强,今天我们将介绍在项目中出现比较多的两种函数,一种是参数函数,还有一种就是Function函数

如果你不了匿名函数请阅读以下文档:

Android kotlin高阶函数与Java lambda表达式介绍与实战_蜗牛、Z的博客-CSDN博客

二.参数函数

        正常在Java中,如果想回调另一个方法或者类中的数据,可以通过接口回调,但是在kotlin语法中,有一种新的定义:参数函数,也叫接口参数

格式

方法名:((参数类型1,参数类型2)->返回值类型)

    var add: ((Int, Int) -> Int)? = null

    var printlog: ((String) -> Unit)? = null
解释:

其实这个很简单,和方法参数一样,只是通过()t给括起来了,如果还不了解方法参数可以参考:

Android kotlin高阶函数与Java lambda表达式介绍与实战_蜗牛、Z的博客-CSDN博客

将匿名函数变成一个函数对象,其他按对象定义变量一样使用。方法中也一样定义

方法传参:

   fun setCallback(function: ((Int, Int) -> Int)?) {

        add = function
    }

    fun  setLogCallback(block: ((String) -> Unit)?){
        printlog=block
    }

如何调用?

这是方法,所以调用格式也是参考方法

   public fun operation() {
        val rsult = add!!(3, 4)
        printlog!!("${rsult}")
        Log.log(rsult)
    }

完整类如下:

class MyFunction {

    var add: ((Int, Int) -> Int)? = null

    var printlog: ((String) -> Unit)? = null


    fun setCallback(function: ((Int, Int) -> Int)?) {

        add = function
    }

    fun  setLogCallback(block: ((String) -> Unit)?){
        printlog=block
    }


    public fun operation() {
        val rsult = add!!(3, 4)
        printlog!!("${rsult}")
        Log.log(rsult)
    }

}

三.如何使用

        使用又分为两种,kotlin的自身调用,和Java的混合调用,但是kotlin的调用又有两种方式,且与普通的函数又不同,Java的调用需要Function函数参数。

在Kotllin中的调用

   val function = MyFunction()
    function.setCallback(function = { x, y ->
        x + y
    })


    function.setLogCallback(block = {
        Log.log(it)
    })
        function.setCallback { x, y -> x+y  }

如果你是直接通过方法调用,如果函数定义了什么参数名,你也要使用相同的,我这里声明了function和block两个,所以直接function={}和block={},里面跟上变量

匿名: function.setCallback { }

直接在方法通过{}来扩展。

Java调用:

java的调用要借助与kotlin中的Funtion函数,Function是interface类型

public interface Function1<in P1, out R> : Function<R> {
    /** Invokes the function with the specified argument. */
    public operator fun invoke(p1: P1): R
}

通过源码可以看出,invoke()就是方法,了解过反射的朋友都知道,这种写法很像hook的风格,通过源码分析也能看出,定义了两个Function,kotlin会根据你的变量多少,映射到对应得function类上,目前系统最多支持22个参数,也就是Function22这个类。

Java中的new:

   public void fun()
    {
        MyFunction function=new MyFunction();
        function.setCallback(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer invoke(Integer integer, Integer integer2) {
                return null;
            }
        });
    }

注意:Java在与kotlin混合开发,无法支持匿名函数写法,无法用过
function.setCallback(){}这种写法IDE会提示出错。

四.Function的总结

        Function是接口类型,目前最多支持22个参数,这个类目前用的最多就是Java与kotlin的混合写,当然你也可以当接口调用。它的功能和我们在kotlin中定义的参数函数是一个道理。所以kotlin在编译成Java文件时,会自动生成对应得function,这样便于Java在混合的调用

五.总结

1、通过以上的分析,我们了解了Function函数的特色以及为什么会有Function函数,最多支持多大参数。以及匿名参数函数的调用与声明。

2、这些在开发过程中属于比较常见的开发技巧,使用率特别高,免去了接口的定义。

猜你喜欢

转载自blog.csdn.net/qq36246172/article/details/132105852