Closed. This question needs details or clarity。它当前不接受答案。












想要改善这个问题吗?添加详细信息,并通过editing this post来解决问题。

1年前关闭。



Improve this question




像filter + findFirst一样,anyMatch是否具有确定性(针对有序流)?
除了返回值以外,还有其他区别吗?

如果我有一个有序的流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的情况下-确定性仅与结果有关,即boolean,因此实际上没有太多可确定性的。是否用于有序流。结果将“确定地”为true/false-这是您获得的唯一保证。

如果您的问题是在使用anyMatch的情况下是否从头开始遍历流,则完全是另外一个问题。当然,这是一个实现细节。但不必那样遍历。在anyMatch的情况下,流内部结构很容易具有不同的路径:这是一个完整的示例,但完全可能:

Stream.of(6, 5, 4, 3, 2, 1)
      .sorted(Comparator.naturalOrder())
      .anyMatch(x -> x > 4);

内部流可以“记住”该流的最小值为1,最大值为6,因为此anyMatch可以采用6并针对max进行测试,如果匹配,就可以了。因此,可以与最后一个元素6进行比较,该元素将与filter.findFirst-5不同。

我非常怀疑这样的优化(可能甚至比“优化”更有害)是否会实现。但理论上是可能的。

关于java - 像filter + findFirst一样,anyMatch具有确定性吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57658411/

10-11 20:14