java - 有序流的减少是否按顺序减少?

标签 java java-8 java-stream

我有一个包含 A、B、C 的列表

C reduce A reduce B != A reduce B reduce C(但是,A reduce (B reduce C) 可以)。

换句话说,我的归约运算是结合性的而不是交换性的。

java 是否强制有序顺序流(例如列表中的默认流)减少总是根据遇到顺序发生?也就是说,java 会重新排序归约(例如 B 归约 A 而不是 A 归约 B)吗?

(希望这足够清楚)。

编辑添加一个小演示,可能有助于澄清

Stream.of(" cats ", " eat ", " bats ")
  .reduce("", (a, b) -> a + b); // cats eat bats

有了上面的内容,输出会是“ bat 猫吃”​​或“吃 bat 猫”吗?这在规范中的某处得到保证吗?

最佳答案

根据规范,它尊重元素的顺序。

证明很简单。 specification声称缩减函数必须 关联

但是,如果不保留顺序,关联性 本身就没有任何意义。根据mathematical definition关联属性:

Within an expression containing two or more occurrences in a row of the same associative operator, the order in which the operations are performed does not matter as long as the sequence of the operands is not changed.

换句话说,关联属性并不意味着:

(a + b) + c = (a + c) + b

它只允许任意排列操作的应用顺序。

关于java - 有序流的减少是否按顺序减少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49520234/

相关文章:

java - Java Servlet API 是否向后兼容?

java - 如果列表的总大小小于限制,stream().limit() 会优化执行吗?

lambda - 对流的 groupBy 结果应用操作

java - Jacoco 需要对 Lambdas Java8 进行特殊处理吗?

collections - 如何组合列表元素并找到最大组合的价格

java - libGDX:FitViewport 中对象的大小扭曲

java - 每次Java编译警告

java - Java代码中用来防止其被复制,粘贴和编译的不可识别字符列表

java - ExecutorService 与 CompletableFuture

java - 无法在Java中将字符串转换为日期,转换后时区错误