【发布时间】:2018-01-12 21:57:44
【问题描述】:
我已经解决了之前的几个问题,例如 Encounter order preservation in java stream、this Brian Goetz 的回答,以及 Stream.reduce() 的 javadoc 和 java.util.stream 包 javadoc,但我仍然无法掌握以下内容:
获取这段代码:
public static void main(String... args) {
final String[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
System.out.println("Alphabet: ".concat(Arrays.toString(alphabet)));
System.out.println(new HashSet<>(Arrays.asList(alphabet))
.parallelStream()
.unordered()
.peek(System.out::println)
.reduce("", (a,b) -> a + b, (a,b) -> a + b));
}
为什么减少总是*保留相遇顺序?
- 到目前为止,经过数十次运行,输出是相同的
【问题讨论】:
-
要添加到 Joe C 的答案中,并行流期望减少(或任何折叠)关联性 (a+b)+c=a+(b+c) 将起作用,但不需要可交换性。尽管数字上的 + 是可交换的,但就字符串连接而言 + 不是:“a”+“b”不是“b”+“a”。所有并行流算法都假设折叠(归约)不是可交换的,并保证在合并时保留左右边。最好写
.reduce("", (acc,x) -> acc + x, (a,b) -> a + b)表明您将 x 添加到累加器,并且两个 lambda 不一定相同。 -
“所有并行流算法都假设折叠(归约)不是可交换的,并保证在合并时保留左右边。” - 这是在哪里记录的?
-
unordered()表示订单未定义,并不是说它保证与原始订单不同或保证会改变。它可以是实现选择的任何内容。 -
路易斯,这是真的。该文档包括大量使用“可能”的工作。这是否意味着我正在使用的实现(openjdk 版本“1.8.0_131”)恰好总是保留遇到顺序?
-
@GeorgeAristy 看到我的回答......但基本上 - 是的
标签: java sorting java-8 java-stream reduce