有没有保证在处理顺序流(sequential and ordered Stream)时,操作是按照遇到的顺序(encounter order)进行的?
我的意思是,如果我有这样的代码:
如果一个流是有序的,大多数操作会按照元素的顺序进行操作;如果流的源是包含 [1, 2, 3] 的 List,则执行 map(x -> x*2) 的结果必须为 [2, 4, 6]。但是,如果源没有定义的遇到顺序,则任何值的排列 [2, 4, 6] 都是有效结果。但是,这次它从“对元素进行操作”开始,但示例是关于生成的流的,因此我不确定它们是否考虑了副作用,而副作用正是这个问题所关注的内容。
我的意思是,如果我有这样的代码:
IntStream.range(0, 5)
.map(i -> {
myFunction(i);
return i * 2;
})
.boxed()
.collect(toList());
有没有保证它会按照生成范围的遇到顺序执行myFunction()调用?
我找到了Stream类的草稿JavaDocs,其中明确说明:
对于顺序流水线,如果流水线源具有定义的遇到顺序,则所有操作都按照流水线源的遇到顺序执行。
但在官方JavaDocs中,这行被删除了。现在仅讨论选定方法的遇到顺序。Java.util.stream文档包中的Side-effects段落说明:
即使管道被限制为产生与流源的遇到顺序一致的结果(例如,IntStream.range(0,5).parallel().map(x -> x*2).toArray()
必须产生[0, 2, 4, 6, 8]
),也不能保证映射函数应用于单个元素的顺序或任何行为参数在给定元素上执行的线程。
但它没有提及顺序流,而且示例是针对并行流的(我的理解是它对顺序和并行流都适用,但这一点我不确定)。
另一方面,在Ordering部分中还指出:如果一个流是有序的,大多数操作会按照元素的顺序进行操作;如果流的源是包含 [1, 2, 3] 的 List,则执行 map(x -> x*2) 的结果必须为 [2, 4, 6]。但是,如果源没有定义的遇到顺序,则任何值的排列 [2, 4, 6] 都是有效结果。但是,这次它从“对元素进行操作”开始,但示例是关于生成的流的,因此我不确定它们是否考虑了副作用,而副作用正是这个问题所关注的内容。