答案 0 :(得分:5)
您可以使用lambda和Stream.reduce,专用于reductions的文档中有一个页面:
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
答案 1 :(得分:3)
这是用Java 8流实现的example used in the Python docs:
List<Integer> numbers = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b);
System.out.println(sum.get());
答案 2 :(得分:2)
Stream.reduce方法
Stream.reduce方法是一种通用的还原操作。考虑以下管道,它计算男性成员的总和&#39;收集名册中的年龄。它使用Stream.sum缩减操作:
Integer totalAge = roster
.stream()
.mapToInt(Person::getAge)
.sum();
将此与以下管道进行比较,该管道使用Stream.reduce操作来计算相同的值:
Integer totalAgeReduce = roster
.stream()
.map(Person::getAge)
.reduce(
0,
(a, b) -> a + b);
此示例中的reduce操作有两个参数:
identity:如果流中没有元素,则identity元素既是缩小的初始值又是默认结果。在此示例中,identity元素为0;如果集合名单中没有成员,则这是年龄总和的初始值和默认值。
accumulator:累加器函数有两个参数:缩减的部分结果(在本例中,到目前为止所有处理过的整数的总和)和流的下一个元素(在本例中为整数)。它返回一个新的部分结果。在此示例中,accumulator函数是一个lambda表达式,它添加两个Integer值并返回一个Integer值:
(a, b) -> a + b
reduce操作始终返回一个新值。但是,累加器函数每次处理流的元素时也会返回一个新值。假设您要将流的元素减少为更复杂的对象,例如集合。这可能会妨碍您的应用程序的性能。如果reduce操作涉及向集合添加元素,那么每次accumulator函数处理元素时,它都会创建一个包含元素的新集合,这是低效的。相反,更新现有集合会更有效。您可以使用Stream.collect方法执行此操作,下一节将介绍该方法。
官方oracle教程描述了Stream.reduce的工作原理。请看一下,我相信它会回答您的问题。