0
我正在使用一个简单的reduce方法,它带有三个参数即viz。身份,累加器和组合器。 这里是我的代码...Java 8 Stream - Reduce函数的组合器没有执行
Integer ageSumComb = persons
.stream()
.reduce(0,
(sum, p) -> {
System.out.println("Accumulator: Sum= "+ sum + " Person= " + p);
return sum += p.age;
},
(sum1, sum2) -> {
System.out.format("Combiner: Sum1= " + sum1 + " Sum2= "+ sum2);
return sum1 + sum2;
但正在发生的事情是没有得到执行该组合。我不明白这背后的原因。 这里是我的输出..
Accumulator: Sum= 0 Person= Max
Accumulator: Sum= 18 Person= Peter
Accumulator: Sum= 41 Person= Pamela
Accumulator: Sum= 64 Person= David
Accumulator: Sum= 76 Person= Pam
然而,没有编译错误和也不例外,我的输出是完全正确的,同我的预期。但没有得到为什么组合器没有执行。
作为一个侧面说明,'回报总和+ = p.age;'是误导性陈述。 “+ =”运算符将变量修改为左侧,但由于“sum”只是一个lambda参数,所以此修改不起作用。由于只有返回的总和很重要,因此该语句应该是'return sum + p.age;',所以如果没有打印语句,整个lambda表达式可能是'(sum,p) - > sum + p.age'。尽管如此,'.mapToInt(p - > p.age).sum()'比三个arg'reduce'更干净更高效。 – Holger
“合并器是并行减少所必需的,其中输入是分区的,为每个分区计算部分累加量,然后将部分结果合并为一个最终结果。”您可以在流包[javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html)中找到此语句。 –