2016-12-01 64 views
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 

然而,没有编译错误和也不例外,我的输出是完全正确的,同我的预期。但没有得到为什么组合器没有执行。

+3

作为一个侧面说明,'回报总和+ = p.age;'是误导性陈述。 “+ =”运算符将变量修改为左侧,但由于“sum”只是一个lambda参数,所以此修改不起作用。由于只有返回的总和很重要,因此该语句应该是'return sum + p.age;',所以如果没有打印语句,整个lambda表达式可能是'(sum,p) - > sum + p.age'。尽管如此,'.mapToInt(p - > p.age).sum()'比三个arg'reduce'更干净更高效。 – Holger

+5

“合并器是并行减少所必需的,其中输入是分区的,为每个分区计算部分累加量,然后将部分结果合并为一个最终结果。”您可以在流包[javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html)中找到此语句。 –

回答

6

组合器仅在并行流中执行。

0

您需要使用parallelStream,而不是stream,如果你要使用组合