首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

函数式编程中的重要概念(4)部分函数

函数式编程中的重要概念(4)部分函数

部分函数部分函数(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
  }
}

返回列表