什么是高阶函数?
详解高阶函数、函数类型、lambda、成员引用。
在 kotlin 中高阶函数指以另一个函数作为参数或返回值的函数。
通过上面高阶函数的定义我们知道高阶函数可以接收函数作为它的实参,可以将函数作为它的返回值。在 java 中我们知道不论是参数还是返回值都有其对应的类型,如 String、int、boolean。那么 kotlin 中的高阶函数的参数或返回值又是什么类型呐?上面说函数可以作为高阶函数的参数或返回值,难道在 kotlin 中存在一种类型叫函数类型?没错 kotlin 中的确存在一种类型叫函数类型(至于什么是函数类型我们稍后介绍)。
其实高阶函数更准确的定义如下:
参数类型或返回值类型是函数类型的函数即高阶函数。
kotlin 中的函数类型是什么类型?
函数类型是某一类函数的抽象表达,一个函数就是一个函数类型的实例,就是一个函数类型的对象。
那如何表示函数类型呐?
在了解如何表示函数类型之前,我们先来看一下一个函数由哪些部分组成。
String function(String param) {
String prefix = "pre";
String result = prefix + param;
return result;
}
我们可以看出一个函数由 返回值类型、函数名、参数类型、参数名以及函数体组成。既然函数类型是某一类函数的抽象表达那么我们对以上函数进行抽象看最终哪些部分能共用?函数体是函数的实现部分,每个函数的函数体都应该是独一无二的,没办法共用;函数名作为函数的标识用以区分参数类型相同的函数,也没办法共用;参数名用于在函数体中区分各个参数,但是函数体不能共用,共用参数名也就没有意义了。
经过上面的分析我们发现最终剩下了 参数类型和返回值类型,kotlin 中的函数类型正是由参数类型和返回值类型组成的。
在 kotlin 中声明函数类型需要将函数的参数类型放在括号中,紧接着是一个箭头和函数的返回值类型。
(参数类型)->返回值类型
(Int,String) -> String
以上函数类型表示 第一个参数是 Int 类型,第二个参数是 String 类型,返回值为 String 类型的函数。
// 在 kotlin 中 val 用以声明变量
// 在 kotlin 变量名在 : 左侧,变量类型在 : 右侧
val sum: (Int, Int) -> Int
// 以上表示声明一个 第一个参数是 Int 类型,第二个参数是 Int 类型,返回值是 Int 类型的函数类型变量 sum
注意:
- 函数类型的返回值类型可以声明为可空类型
val canReturnNull: (Int, Int) -> Int? - 声明一个可空的函数类型
val funOrNull: ((Int, Int) -> Int)? - 为函数类型中声明的参数指定名字
val sum: (age:Int, name:String) -> Int
kotlin 中的函数类型对应 java 中的什么?
kotlin 的代码最终都会编译成 .class 那么 kotlin 中的函数类型对应 java 中的什么呐?
class Height {
val sum: (Int, Int) -> Int = {
a, b -> a * b }
}
如上声明一个函数类型的变量,通过 idea 提供的 Show Kotlin Bytecode 反编译查看其对应的 java 代码如下
import kotlin.Metadata;
import kotlin.jvm.functions.Function2;
import org.jetbrains.annotations.NotNull;
public final class Height {
@NotNull
private final Function2 sum;
@NotNull
public final Function2 getSum() {
return this.sum;
}
public Height() {
this.sum = (Function2)null.INSTANCE