原标题:Java BiFunction 接口实例
www.baeldung.com/java-bifunction-interface
1. 简介
Java8 引入了函数式编程,可以把函数作为参数传入实现通用方法。熟知的 Java 8 单个参数函数式接口比如 Function、Predicate 和 Consumer。
这篇教程会介绍如何使用支持两个参数的函数式接口。这样的函数被称为二元函数,在 Java 中使用 BiFunction 函数式接口。
2. 单个参数函数
让我们快速回顾一下如何使用单个参数函数或者一元函数,就像在Stream教程中实现的示例:
List mapped = Stream.of( "hello", "world")
. map(word -> word + "!")
.collect(Collectors.toList);
assertThat(mapped).containsExactly( "hello!", "world!");
上面的单元测试中,map 方法接受1个 Function 类型作为参数,对给定的的输入操作后返回结果。
3. 双参操作
Java Stream 库提供了 reduce 函数,可以组合 Stream 中的元素。在这里定义已接收的数据如何与下一个操作转换。
reduce 接受 BinaryOperator 类型作为参数,支持输入两个类型相同的对象。
假设要求把 Stream 中的数据通过破折号连接起来,下面是几种实现方案。
3.1. 使用 Lambda 表达式
用 Lambda 实现BiFunction,前面是由括号包围的两个参数:
String result = Stream.of( "hello", "world")
.reduce( "", (a, b) -> b + "-"+ a);
assertThat(result).isEqualTo( "world-hello-");
上面的示例中,a、b 两个值是字符串类型。Lambda 实现把两个参数按照要求组合,b 在前,a 在后,中间是破折号。
可以看到 reduce 的第一个参数是空字符串,Stream 中的第一个值会与空字符串连接。
另外可以注意到,Ja