首页 > 解决方案 > 并行流的行为与流不同

问题描述

我无法理解为什么并行流和流对完全相同的语句给出不同的结果。

    List<String> list = Arrays.asList("1", "2", "3");
    String resultParallel = list.parallelStream().collect(StringBuilder::new,
            (response, element) -> response.append(" ").append(element),
            (response1, response2) -> response1.append(",").append(response2.toString()))
            .toString();
    System.out.println("ResultParallel: " + resultParallel);

    String result = list.stream().collect(StringBuilder::new,
            (response, element) -> response.append(" ").append(element),
            (response1, response2) -> response1.append(",").append(response2.toString()))
            .toString();

    System.out.println("Result: " + result);

结果并行:1、2、3

结果:1 2 3

有人可以解释为什么会发生这种情况以及我如何让非并行版本给出与并行版本相同的结果吗?

标签: javaparallel-processingjava-stream

解决方案


Java 8Stream.collect方法具有以下签名:

<R> R collect(Supplier<R> supplier,
              BiConsumer<R, ? super T> accumulator,
              BiConsumer<R, R> combiner);

WhereBiConsumer<R, R> combiner仅在并行流中调用(以便将部分结果组合到单个容器中),因此您的第一个代码片段的输出是:

ResultParallel: 1, 2, 3

在没有被调用的sequential版本中(见这个答案),因此以下语句被忽略:combiner

(response1, response2) -> response1.append(",").append(response2.toString())

结果是不同的:

1 2 3

如何解决?检查@Eugene 的答案或这个问题和答案


推荐阅读