Higher Order Functions 概述介绍不同,这里着重探索 Function Type

  1. class Age {
  2. // 定义一个函数操作符,int入参,int为返回值
  3. operator fun invoke(offset:Int): Int {
  4. return 9 + offset
  5. }
  6. }
  7. fun main(args: Array<String>) {
  8. var age = Age() //实例化一个对象
  9. var value = age(2) //直接将对象实例当做方法调用了
  10. println(value)
  11. }

定义函数操作符需要

  1. 必须要提供operator关键字

  2. 函数名必须是 invoke

  3. 函数必须为成员函数,及类或者接口的函数

如上代码片段中

  • 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 包下函数(fun)类型 - 图1
由于函数类型是由函数形参个数、形参类型和返回值类型决定,因此如果超过了预设规定的范围,
就要自定义函数接口。
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() //直接通过函数操作符调用