在深入讨论 Stream.reduce() 功能之前,让我们先了解几个概念
Identity : 定义一个元素代表是归并操作的初始值,如果Stream 是空的,也是Stream 的默认结果
Accumulator: 定义一个带两个参数的函数,第一个参数是上个归并函数的返回值,第二个是Strem 中下一个元素。
Combiner: 调用一个函数来组合归并操作的结果,当归并是并行执行或者当累加器的函数和累加器的实现类型不匹配时才会调用此函数。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int result = numbers
.stream()
.reduce(0, (subtotal, element) -> subtotal + element);
assertThat(result).isEqualTo(21)
上面示例中,reduce 方法的第一个参数 0 是 identity ,此参数用来保存归并参数的初始值,当Stream 为空时也是默认的返回值。(subtotal, element) -> subtotal + element 是accumulator ,第一个参数是上次累计的和,第二个参数是数据流的下一个元素。为了使代码更简洁,我们可以用方法引用来代替 lambda 表达式。
当然,我们可以用reduce 方法处理其他类型的 stream,例如,可以操作一个 String 类型的数组,把数组的字符串进行拼接。
List<String> letters = Arrays.asList("a", "b", "c", "d", "e");
String result = letters
.stream()
.reduce("", (partialString, element) -> partialString + element);
assertThat(result).isEqualTo("abcde");
https://blog.csdn.net/lijingronghcit/article/details/108348728