java - Java 8 findFirst().isPresent() 是否比 count() > 0 更有效?

标签 java java-8 java-stream

假设我有一个流 Stream<T> stream = list.stream().filter(some predicate)如果列表非常大,通过以下方式检查流是否非空是否更有效:stream.count() > 0或者通过做:stream.findFirst().isPresent()

最佳答案

如果你只想知道是否匹配,你应该使用
list.stream().anyMatch(some predicate),不仅因为它更高效,而且因为它是表达您意图的正确成语。

正如其他人所说,anyMatch 是短路的,这意味着它会在第一次匹配时停止,而 count 顾名思义,将计数 < em>all 返回前匹配。根据流内容,这可能会产生巨大的性能差异。但请注意,您可以通过使用使 count 同样高效 list.stream().filter(some predicate).limit(1).count() > 0

然后,它也会在第一次出现后停止,但是,如前所述,anyMatch 仍然是表达您对是否有任何匹配。当任务是找出是否有至少 n 匹配项时,情况发生了变化。然后,.limit(n).count() > n-1(或>= n)成为自然的习语。

请注意,findFirst() 与其他解决方案不同,因为它的答案取决于顺序。因此,如果您只想知道是否存在匹配项,则应改用 findAny()。尽管如此,由于返回匹配值的要求与仅告知是否存在匹配(如 anyMatch 所做的)相比,理论上存在差异,尽管目前差异仅在于 的构造code>可选实例,因此可以忽略不计。

但是由于您是针对 API 进行编程以对您的意图进行编码,因此当您只想知道是否存在匹配项时,不应使用 find...anyMatch 清楚地表达了您的意图,并且可能在未来的实现或更复杂的场景中具有更高的 yield 。

关于java - Java 8 findFirst().isPresent() 是否比 count() > 0 更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39713964/

相关文章:

java - com.gluonhq.charm.glisten.control.TextField 不存在

java - 合并多级 HashMap 的最快方法

java - 如何将 Timestamp 转换为 LocalDateTime 保留时区?

Java lambda 循环

java - 在迭代期间更改 HashMap 键

java - 如何使用 Java 从 TCP 发送和接收 RST 标志?

java - 线程安全的 LRU 缓存实现

java - 如何将 Java 8 流转换为数组?

java - 使用 java8 Streams 在列表中合并内部列表

java - 如何将流收集到 TreeMap 中