anyMatch 是否具有确定性(对于有序流),例如 filter + findFirst?除了返回值之外还有其他区别吗?
如果我有一个有序流 asList("a","b","c").filter(predicate).findFirst() 则保证将按给定顺序为流的每个元素评估谓词(“ a”比“b”比“c”)直到匹配(findFirst)。我想知道 asList("a","b","c").anyMatch(predicate) 是否也会按照给定的顺序评估谓词(“a”比“b”比“c”)?
这里没有太多确定性的事情;至少你要求的比较没有什么意义。filter.findFirst
将返回一个Optional<T>
,所以如果您关心找到了哪个元素,它真的是有序流的第一个元素吗?如果是这样,答案是肯定的 - 但看来你已经意识到了这一点。
在 - 的情况下,anyMatch
决定论仅与结果有关,即 a boolean
,因此实际上没有太多确定性;是否适用于有序流。结果将是“确定性”的true/false
——这是你得到的唯一保证。
如果您的问题是否会从头开始遍历流,则情况anyMatch
是一个完全不同的问题。当然,这是一个实现细节;但不一定非要这样遍历。流内部很容易有不同的路径,在以下情况下采用anyMatch
:一个完全虚构的示例,但完全有可能:
Stream.of(6, 5, 4, 3, 2, 1)
.sorted(Comparator.naturalOrder())
.anyMatch(x -> x > 4);
Run Code Online (Sandbox Code Playgroud)
流内部可以“记住”该流的最小值是 ,1
最大值是6
,因为这anyMatch
可以采取6
并且测试针对max
,如果匹配,则完成。因此,比较可能会针对最后一个元素 - 进行6
,这将与filter.findFirst
-不同5
。
我非常怀疑这种优化(这甚至可能比“优化”造成的伤害更大)是否会被完成;但理论上是可能的。
归档时间: |
|
查看次数: |
3029 次 |
最近记录: |