【问题标题】:why combiner function is not executed in java-8 stream reduce operation? [duplicate]为什么在 java-8 流减少操作中不执行组合器功能? [复制]
【发布时间】:2017-07-08 20:50:37
【问题描述】:

我正在尝试了解流中的 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&lt;Integer&gt; l, Integer a) -&gt; {l.add(a);return l;}中发生的事情
有人可以解释为什么不打印吗? Java 文档说function for combining two values, which must be compatible with the accumulator function

谢谢, 阿马尔

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

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

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

    【讨论】:

    • 我正在尝试一个示例 tat 已在 Java 8 中列出,它也提到了您提到的注释。
    【解决方案2】:

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

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

    combiner 函数将两个 partial 结果组合在一起以产生一个新的 partial 结果。 (在并行归约中需要组合器,其中输入被分区,为每个分区计算部分累加,然后将部分结果组合以产生最终结果。)

    “必要”暗示如果您的流是或流中仅包含单个元素combiner 也永远不会在并行流中调用。

    所以如果你想看到"l1 is" + l1 + "l2 is " + l2被打印出来,你应该在并行流中运行它,例如:

    //                       v--- make the stream run in parallel   
    Stream.of(1,2,3,4,5,6,7).parallel().reduce(...).forEach(System.out::println);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 2017-04-13
      • 2015-07-07
      • 2014-12-16
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多