部分函数部分函数(partial function)是指仅有部分输入参数被绑定了实际值的函数。清单 6 中的函数 f(a, b, c) = a + b +c 有 3 个参数 a、b 和 c。正常情况下调用该函数需要提供全部 3 个参数的值。如果只提供了部分参数的值,如只提供了 a 值,就得到了一个部分函数,其中参数 a 被绑定成了给定值。假设给定的参数 a 的值是 1,那新的部分函数的定义是 fa(b, c) = 1 + b + c。由于 a 的实际值可以有无穷多,也有对应的无穷多种可能的部分函数。除了只对 a 绑定值之外,还可以绑定参数 b 和 c 的值。
清单 6. 部分函数示例1
2
3
4
5
6
7
| function f(a, b, c) {
return a + b + c;
}
function fa(b, c) {
return f(1, b, c);
}
|
部分函数可以用来为函数提供快捷方式,也就是预先绑定一些常用的参数值。比如函数 add(a, b) = a + b 用来对 2 个参数进行相加操作。可以在 add 基础上创建一个部分函数 increase,把参数 b 的值绑定为 1。increase 相当于进行加 1 操作。同样的,把参数值 b 绑定为 -1 可以得到函数 decrease。
Java 标准库并没有提供对部分函数的支持,而且由于只提供了 Function 和 BiFunction,部分函数只对 BiFunction 有意义。不过我们可以自己实现部分函数。部分函数在绑定参数时有两种方式:一种是按照从左到右的顺序绑定参数,另外一种是按照从右到左的顺序绑定参数。这两个方式分别对应于 清单 7 中的 partialLeft 和 partialRight 方法。这两个方法把一个 BiFunction 转换成一个 Function。
清单 7. 部分函数的 Java 实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| public class PartialFunctions {
private static <T, U, R> Function<U, R> partialLeft(BiFunction<T,
U, R> biFunction, T t) {
return (u) -> biFunction.apply(t, u);
}
private static <T, U, R> Function<T, R> partialRight(BiFunction<T,
U, R> biFunction, U u) {
return (t) -> biFunction.apply(t, u);
}
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> biFunction = (v1, v2) -> v1
- v2;
Function<Integer, Integer> subtractFrom10 =
partialLeft(biFunction, 10);
Function<Integer, Integer> subtractBy10 = partialRight(biFunction,
10);
System.out.println(subtractFrom10.apply(5)); // 5
System.out.println(subtractBy10.apply(5)); // -5
}
}
|
|