Java 的 ArrayList.stream().anyMatch() 是否保证按顺序处理?



我有这个代码:

ArrayList<Detector> detectors;
detectors.stream().anyMatch(d -> d.detectRead(impendingInstruction, fieldName));

但我也希望得到保证:

  • 列表按顺序处理,从第一个元素到最后一个元素;
  • 一旦元素返回true,计算立即停止

这是否总是正确的,或者如果不是,至少对于所有常见的JDK实现都是这样?

您的问题意味着担心流操作的副作用,否则您不会关心顺序或立即终止。 来自Javadoc:

副作用

通常不鼓励对流操作的行为参数产生副作用,因为它们通常会导致无意中违反无状态要求,以及其他线程安全危害。

如果行为参数确实有副作用,除非明确说明,否则不能保证这些副作用对其他线程的可见性,也不能保证在同一流管道中对"相同"元素的不同操作在同一线程中执行。此外,这些效果的顺序可能令人惊讶。即使管道被约束为生成与流源的遭遇顺序一致的结果(例如,IntStream.range(0,5).parallel().map(x -> x*2).toArray() 必须生成 [0, 2, 4, 6, 8]),也不能保证映射器函数应用于单个元素的顺序, 或者在哪个线程中为给定元素执行任何行为参数。

所以合同似乎是你可能会侥幸逃脱,但它不能保证有效。