gpt4 book ai didi

java - Parallel Stream 与 Stream 的行为不同

转载 作者:太空狗 更新时间:2023-10-29 22:51:42 24 4
gpt4 key购买 nike

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

    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

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

最佳答案

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

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

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

ResultParallel: 1, 2, 3

sequential版本 combiner不会被调用(参见 answer ),因此忽略以下语句:

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

结果是不同的:

1 2 3

如何解决?检查@Eugene 的 answer或者这个 question and answers .

关于java - Parallel Stream 与 Stream 的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51724266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com