假设我有一个流 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/