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

Pet*_*ček 4 java java-stream

我有这个代码:

ArrayList<Detector> detectors;
detectors.stream().anyMatch(d -> d.detectRead(impendingInstruction, fieldName));
Run Code Online (Sandbox Code Playgroud)

但我还要保证:

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

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

Jim*_*son 6

您的问题意味着关注流操作的副作用,否则您不会关心订单或立即终止.来自Javadoc:

副作用

通常,不鼓励行为参数对流操作的副作用,因为它们通常会导致无意中违反无国籍要求以及其他线程安全危险.

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

所以合同似乎是你可以侥幸逃脱,但它不能保证工作.

  • ....如果你确实想要使用副作用,你*不应该*使用Java 8流来执行此操作. (2认同)