- Higher Order Functions 概述介绍不同,这里着重探索
Function Type
">与Higher Order Functions 概述介绍不同,这里着重探索Function Type
- Kolin预设的函数类型接口
与Higher Order Functions 概述介绍不同,这里着重探索 Function Type
class Age {
// 定义一个函数操作符,int入参,int为返回值
operator fun invoke(offset:Int): Int {
return 9 + offset
}
}
fun main(args: Array<String>) {
var age = Age() //实例化一个对象
var value = age(2) //直接将对象实例当做方法调用了
println(value)
}
定义函数操作符需要
必须要提供
operator
关键字函数名必须是
invoke
函数必须为成员函数,及类或者接口的函数
如上代码片段中
age 代表
fun对象(函数对象)
age 后的
()
代表函数操作符(这个跟set,get类似)age 需要的参数及 invoke 函数的参数,返回值及 invoke 函数的返回值
Java 和Kotlin 在本质上是没有区别的,编译后的代码都是在JVM 上运行,Kotlin 还是和Java 100% 兼容,那么能得出一个结论就是,Kotlin 编译好的代码能反编译成Java 代码。
因此通过反编译kotlin生成后的代码会发现,其实能直接将对象实例作为方法调用,核心转换过程如下
转换前:
var value = age(2)
转换后:
Age age = new Age();
int value = age.invoke(2); //直接转换成方法的调用
Kolin预设的函数类型接口
预设的接口一共有23个,位于 kotlin.jvm.functions 包下
由于函数类型是由函数形参个数、形参类型和返回值类型决定,因此如果超过了预设规定的范围,
就要自定义函数接口。
Kotlin 中可以使用 (P0,P1,...) -> R
方式声明一个对象为固定函数类型接口,只能是Kotlin 给出的23 个
示例:
// (int,String) -> Int 以及在预设的函数接口中
var funObject: (Int, String) -> Int = { a, b ->
println(a)
println(b)
}
自定义函数类型接口方式:object:Interface{...}
示例:
//定义一个函数类型接口
interface FunInterface<R> {
//无入参,返回值为R类型
operator fun invoke():R
}
var funObject = object : FunInterface<Int> {
override fun invoke(): Int {
return 9
}
}
//输出 9
val value = funObject() //直接通过函数操作符调用