按照定义,高阶函数就是以另一个函数作为参数或者返回值的函数。在Kotiin中, 函数可以用
lambda
或者函数引用来表示。
因此,任何以
lambda
或者函数引用作为参数的函数,或者返回值为lambda
或函数 引用的函数,或者两者都满足的函数都是高阶函数 。
来看一段代码:
fun main() {
val added = compute(2, 3) { a, b -> a + b }
val multi = compute(2, 3) { a, b -> a * b }
println("added=$added, multi=$multi")
}
fun compute(x: Int, y: Int, operation: (Int, Int) -> Int)
= operation(x, y)
看输出:
added=5, multi=6
这段代码逻辑非常简单,但是表现的是一个偏函数的定义与使用。
如果是 python
,也能很容易做到上面的类似逻辑。但是如果是 Java
, 几乎无法实现相同的逻辑。
这段代码展示的内容很酷。比如上面的compute
函数,接收3个参数,前两个是数据,第三个是函数。compute
本身不做任何的逻辑,只是将数据传给 第三个参数,让这个函数去做实际的逻辑处理。
而这个 lambda
也没有去做任何的逻辑处理,只是定义的参数类型和返回值类型。然后被调用者处理。
所以调用者可以根据实际需要进行实际逻辑的处理。
比如上面的:
val added = compute(2, 3) { a, b -> a + b }
val multi = compute(2, 3) { a, b -> a * b }
这种方式完全可以取代传统Java 中的很多回调定义与实现。
如果是 Java 来实现,可以是这样的操作:
public class Main {
public static void main(String[] args) {
compute(2, 3, new Function2<Integer, Integer, Integer>() {
@Override
public Integer invoke(Integer x, Integer y) {
return x + y;
}
});
compute(2, 3, new Function2<Integer, Integer, Integer>() {
@Override
public Integer invoke(Integer x, Integer y) {
return x * y;
}
});
}
public static int compute(int a, int b, Function2<Integer, Integer, Integer> func) {
return func.invoke(a, b);
}
}