一.介绍
在现在以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、这些在开发过程中属于比较常见的开发技巧,使用率特别高,免去了接口的定义。