【发布时间】:2018-09-06 07:06:41
【问题描述】:
我有一个List,由 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
有了以上内容,输出可能是“bats cat eat”还是“eat bats cats”?这在规范中的某个地方得到保证吗?
【问题讨论】:
-
@shmosel 好的,但这是列表的缩减,而不是特定列表元素的缩减!!
-
@Andremoniy 我认为它的意思是
op.apply(op.apply(a, b), c),其中op是BinaryOperator。 -
@DD 你设法让事情变得更加混乱。
-
@shmosel
reduce("", (a, b) -> a + " " + b)将违反有关身份值的合同,因为f(id, x) == x不成立。因此,在将其与并行流一起使用时,您确实会得到不需要的虚假空间。使用String::concat很好,这不应该让人感到意外,因为.reduce("", String::concat)可以作为有效(但低效)减少right in the documentation 的示例。
标签: java java-8 java-stream