【发布时间】:2016-03-21 21:17:05
【问题描述】:
在 Java 8 附带的流媒体库中,我们提供了 forEachOrdered API,其文档在此处复制
void forEachOrdered(消费者行为)
为此流的每个元素执行一个操作。
这是终端操作。
此操作一次处理一个元素,如果存在则按遇到顺序。 对一个元素执行操作发生在对后续元素执行操作之前,但对于任何给定元素,该操作可以在库选择的任何线程中执行。
我们对从map API 订购有任何保证吗?
例如,我在代码中有以下内容
private final BazUtils bazUtils;
public List<Foo> getFoos(List<Bar> bars) {
AtomicInteger idx = new AtomicInteger(1);
return bars.stream()
.map(bar -> bazUtils.getFoo(bar, idx.getAndAdd(1)))
.collect(Collectors.toList());
}
在处理过程中会遵守bars 的顺序吗?
【问题讨论】:
-
我很难理解你所说的“接受一个元素及其在列表中的位置的函数”是什么意思,因为传递给
Stream.map的函数将只接收一个参数,而流不会给你一个职位。除此之外,您似乎混淆了 processing 顺序和 encounter 顺序。也许this 有点帮助(另请参阅 Stuart Marks 的评论)。 -
Holger,我可以为 map() 提供一个函数,它接受一个参数,但返回对另一个依赖多个参数的函数的调用。例如,{idx;地图(x -> foo(x, idx));}.
-
当然,但是
idx与x及其位置完全无关。 -
如果
idx是您打算修改的堆变量,那么答案是否,没有关于处理的保证对于并行流的顺序,该函数甚至可以同时进行评估。从映射函数中修改变量时,您可能会遇到竞争条件。如果中间步骤和终端动作都没有清除流的有序属性,则为有效的最终结果将保持 遭遇 顺序。 -
您好 Holger,为了清楚起见,我在问题中的示例中添加了详细信息。
标签: java functional-programming java-8 java-stream