java - 并行流的行为与流不同
问题描述
我无法理解为什么并行流和流对完全相同的语句给出不同的结果。
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 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
推荐阅读
- python - 为什么列表在此代码中无法正常工作?
- angular - 如何为每张图片上传多张图片需要上传小中大图片#angular 6
- swift - 仅过滤要在 GMSAutocompleteViewController 中显示的健身房
- c++ - 如何一起使用Opencv、qt creator、ming gw windows?
- junit - 无法在 EmbeddedCassandra 中为 JUnit 创建密钥空间
- docker - 如何访问 Jenkins 机密目录?
- c++ - 在没有比较运算符的情况下找到两个数字之间的最小值
- typescript - 打字稿将泛型约束为字符串文字类型以用于计算对象属性
- javascript - 获取日期格式为“DD-MM-YYYY”
- twitter-bootstrap - 整个滑动仅包含带有两个控制箭头的文本