Java 8 findFirst().isPresent() 比 count() > 0 更高效吗?

2024-04-10

鉴于我有一个流Stream<T> stream = list.stream().filter(some predicate)如果列表非常大,通过执行以下操作来检查流是否非空是否更有效:stream.count() > 0或者通过这样做:stream.findFirst().isPresent()?


如果您想知道的是是否存在匹配项,则应该使用
list.stream().anyMatch(some predicate),不仅因为它更有效率,而且还因为它是表达你意图的正确习语。

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

然后,它也会在第一次出现后停止,但是,如上所述,anyMatch仍然是表达您对是否有兴趣的首选方式任何比赛。当任务是找出是否有at least n火柴。然后,.limit(n).count() > n-1 (or >= n) 成为自然的习语。

注意findFirst()与其他解决方案不同,因为它的答案取决于顺序。所以如果你只想知道是否有匹配,你应该使用findAny()反而。尽管如此,由于需要返回匹配值,与仅告知是否存在匹配相比,仍然存在理论上的差异,例如anyMatch确实如此,尽管目前这种差异仅在于构建Optional例,因此可以忽略不计。

但由于您正在针对 API 进行编程来编码您的意图,因此您不应该使用find…当你只想知道是否有匹配时。anyMatch清楚地表达了您的意图,并且可能在未来的实现或更复杂的场景中带来更大的好处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 findFirst().isPresent() 比 count() > 0 更高效吗? 的相关文章

随机推荐