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

时间:2016-07-10 06:51:31

标签: java java-stream

我有这段代码:

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

但我还要保证:

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

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

1 个答案:

答案 0 :(得分:6)

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

  

副作用

     

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

     

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

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