anyMatch 是否像过滤器 + findFirst 那样具有确定性?

tel*_*bog 5 java java-stream

anyMatch 是否具有确定性(对于有序流),例如 filter + findFirst?除了返回值之外还有其他区别吗?

如果我有一个有序流 asList("a","b","c").filter(predicate).findFirst() 则保证将按给定顺序为流的每个元素评估谓词(“ a”比“b”比“c”)直到匹配(findFirst)。我想知道 asList("a","b","c").anyMatch(predicate) 是否也会按照给定的顺序评估谓词(“a”比“b”比“c”)?

Eug*_*ene 3

这里没有太多确定性的事情;至少你要求的比较没有什么意义。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

我非常怀疑这种优化(这甚至可能比“优化”造成的伤害更大)是否会被完成;但理论上是可能的。