柯里化:有多个箭头的 lambda 表达式,把多个参数的函数转换为只有一个参数的函数。
例如:
x -> y -> x + y
这样子的。
可以这样理解:输入了 X 返回了 (y -> x + y), 再拆,输入了 y 返回了 x + y。
所以可写成:
Function<Integer, Function<Integer, Integer>> fun = x ->y -> x + y;
如上,这就是级联表达式。
继续刚才的代码,使用
System.out.println(fun.apply(2).apply(3));
来调用,运行输出结果 5。
柯里化的意义: 把函数标准化。
柯里化后,所有的函数都只有一个参数,调用起来就比较灵活,可以使用一些灵活的特性,比如把函数组合起来,
做过前端的同学可能会遇到过这个题目:
实现 var a = add(2)(3)(4); // 9
我们在 Java 里面可以这么做:
Function<Integer, Function<Integer, Function<Integer, Integer>>> fun2 = x -> y -> z -> x + y + z;
System.out.println(fun2.apply(2).apply(3).apply(4));
还可以这样做:
int[] nums = {2, 3, 4};
Function f = fun2;
for (int i = 0; i < nums.length; i++){
if (f instanceof Function){
Object obj = f.apply(nums[i]);
if (obj instanceof Function){
f = (Function) obj;
} else {
System.out.println(" end: " + obj);
}
}
}
这就是高阶函数:返回函数的函数。
代码地址: https://github.com/hmilyos/lambda-demo.git