为什么在java-8流减少操作时没有执行组合器函数?

时间:2017-07-08 11:52:35

标签: java java-8 java-stream

我试图了解流中的reduce方法是如何工作的。

Stream.of(1,2,3,4,5,6,7).reduce(new ArrayList<>(),
(List<Integer> l, Integer a) -> {l.add(a);return l;},
(List<Integer> l1, List<Integer> l2) -> {
System.out.println("l1 is" + l1 + "l2 is " + l2);
l1.addAll(l2);
return l1;
}).forEach(System.out::println);

线System.out.println("l1 is" + l1 + "l2 is " + l2)永远不会被打印出来。 我能理解(List<Integer> l, Integer a) -> {l.add(a);return l;}中发生的事情 有人可以解释为什么不打印? java文档说function for combining two values, which must be compatible with the accumulator function

谢谢, 阿玛尔

2 个答案:

答案 0 :(得分:4)

仅当流并行时才调用它。在这种情况下,流值被分成两半(递归),每一半被缩减为一个列表,然后两个列表必须组合在一起。

请注意,减少不应该改变作为参数接收的值(在本例中为列表)。它应该返回一个新值。在这种情况下,可变减少(即collect())是更好的选择。

答案 1 :(得分:3)

它在java.util.stream包摘要中描述如下:

<U> U reduce(U identity,
          BiFunction<U, ? super T, U> accumulator,
          BinaryOperator<U> combiner);
  

合并器功能结合了两个部分结果,以生成新的部分结果。 (组合器在并行缩减中是必需的,其中输入被分区,为每个分区计算部分累积,然后组合部分结果以产生最终结果。)

&#34;必要&#34; 暗示您的信息流为空或仅包含单个元素,{ {1}}也永远不会在并行流中调用。

因此,如果您希望打印combiner,则应在并行流中运行它,例如:

"l1 is" + l1 + "l2 is " + l2