为什么Combiner不影响输出?

时间:2017-07-27 08:45:29

标签: java java-8 java-stream

以下代码输出始终为24。

public static void main(String[] args) throws InterruptedException {
    List<String> list = new ArrayList<String>();
    list.add("java");
    list.add("php");
    list.add("python");
    list.add("perl");
    list.add("c");
    list.add("lisp");
    list.add("c#");
    int s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> 0);
    System.out.println(s);
    s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x - y);
    System.out.println(s);
    s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x * y);
    System.out.println(s);

}   

问题是组合器影响我的代码的原因。

2 个答案:

答案 0 :(得分:5)

组合器仅 用于并行流。

但即使添加parallel,您的代码也可能存在其他问题。他们都违反了一些规则......具体来说:

  

此外,组合器功能必须与累加器功能兼容;对于所有你和你,以下必须持有

 combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)

你的合成器违反了这一点,所以根据你拥有的CPU数量 - 你会得到不同的结果 - 这显然是错误的。

答案 1 :(得分:2)

如果您减少并行combiner

Stream会影响结果。对于顺序Stream,不需要组合部分结果。

例如,当我在代码中将stream()更改为parallelStream()时,我得到:

0
6
2304

当然,你提供的所有合成器都是糟糕的合成器。您应该提供影响reduce的最终结果的合并器。