Java 8 findFirst().isPresent() 是否比 count() > 0 更有效?
假设我有一个列表非常大的流,那么通过执行:或通过执行:来检查流是否为非空是否更有效?Stream<T> stream = list.stream().filter(some predicate)
stream.count() > 0
stream.findFirst().isPresent()
假设我有一个列表非常大的流,那么通过执行:或通过执行:来检查流是否为非空是否更有效?Stream<T> stream = list.stream().filter(some predicate)
stream.count() > 0
stream.findFirst().isPresent()
如果你想知道的只是是否有匹配,你应该使用
,不仅因为它更有效率,而且,因为它是表达你意图的正确习语。list.stream().anyMatch(some predicate)
正如其他人所说,是短路,这意味着它将在第一场比赛停止,而顾名思义,它将在返回之前计算所有比赛。根据流内容,这可能会产生巨大的性能差异。但请注意,您可以使用anyMatch
count
count
list.stream().filter(some predicate).limit(1).count() > 0
然后,它也将在第一次出现后停止,但是,如前所述,仍然是表达您对是否有任何匹配感兴趣的首选方式。事情发生了变化,当任务是找出是否至少有匹配项时。然后,(或)成为自然的成语。anyMatch
n
.limit(n).count() > n-1
>= n
请注意,它与其他解决方案不同,因为它的答案取决于顺序。因此,如果您只想知道是否存在匹配项,则应改用。尽管如此,由于返回匹配值的要求,与仅告诉是否存在匹配项(如deed)相比,存在理论差异,尽管目前该差异仅在于实例的构造,因此可以忽略不计。findFirst()
findAny()
anyMatch
Optional
但是,由于您是针对API进行编程以编码您的意图,因此当您只想知道是否存在匹配项时,不应使用。 清楚地表达了您的意图,并可能在未来的实现或更复杂的场景中获得更高的好处。find…
anyMatch
我建议使用 ,这是这种情况的终端操作。它不仅比 更有效,而且不会挂在无限的流上。list.stream().anyMatch(some predicate)
stream.count()