我有这段代码:
ArrayList<Detector> detectors;
detectors.stream().anyMatch(d -> d.detectRead(impendingInstruction, fieldName));
但我还要保证:
true
,评估就会立即停止这是否总是如此,或者如果不是,至少对于所有常见的JDK实现是否正确?
答案 0 :(得分:6)
您的问题意味着对流操作的副作用的担忧,否则您不会关心订单或立即终止。来自Javadoc:
副作用
通常不鼓励对流操作的行为参数产生副作用,因为它们通常会导致无意中违反无国籍要求以及其他线程安全隐患。
如果行为参数确实有副作用,除非明确说明,否则不保证这些副作用对其他线程的可见性,也不保证对“同一”元素内的不同操作相同的流管道在同一个线程中执行。此外,这些效果的排序可能令人惊讶。即使管道被约束产生的结果与流源的遭遇顺序一致(例如,IntStream.range(0,5).parallel()。map(x - &gt; x * 2).toArray ()必须产生[0,2,4,6,8]),不保证mapper函数应用于单个元素的顺序,或者对给定元素执行任何行为参数的线程。
所以合同似乎是你可以侥幸逃脱,但它不能保证工作。