高阶函数

定义

高阶函数就是以另一个函数为参数,或者返回值为函数的函数。例如常用的filter,map,with等都是高阶函数

函数类型

  1. 函数类型必须显示的表示出来,如Unit在普通函数中可以隐藏。但是在函数类型的声明中,必须完整的写出来。
  2. 当你已经声明了函数类型后,你再写lambda函数,就可以省略掉lambda函数里的参数类型,而直接写他的参数名。
  3. 同样的,函数类型也有可空的。但是有两点区分
    1
    2
    3
    4
    5
    6
    val testNull1: (Int) -> Int? = { null }
    val testNull2: ((Int) -> Int)? = null

    val testError: (Int) -> Nothing = {
    throw Exception("Error")
    }
    一个是返回类型的可空,一个是函数类型的可空。

在java中使用函数类

其背后原理为:函数类型在编译后会被声明为一个普通的接口,一个函数类型的变量就是FunctionN的一个实现。kolitn定义了一系列接口,包括不同数量的参数,Function0(没有参数的函数)、 Function1<P1,R>(一个参数的函数),等等。每个接口都实现一个invoke方法,这个方法就是lambda函数的函数体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//java8后的版本
var calculate = new Calculate((Integer a, Integer b) -> a - b);
System.out.println(calculate.calculate(1, 2));

//java8以前
var calculate1 = new Calculate(
new Function2<Integer, Integer, Integer>() {

@Override
public Integer invoke(Integer integer, Integer integer2) {
return integer + integer2;
}
}

);
System.out.println(calculate1.calculate(1, 2));
  • 函数类型的参数也可以设置一个默认值
  • 函数也可以返回一个函数,通常用于返回一个常用的逻辑。
  • 也可以通过lambda函数实现合并提取出重复代码,简化整体。