[英]Is Java 8 findFirst().isPresent() more efficient than count() > 0?
鑒於我有一個Stream<T> stream = list.stream().filter(some predicate)
,其中列表非常大,通過執行以下stream.count() > 0
來檢查流是否為空是否更有效: stream.count() > 0
或通過執行: stream.findFirst().isPresent()
?
我建議使用list.stream().anyMatch(some predicate)
,這正是這種情況下的終端操作。 它不僅比stream.count()
更有效,而且它不會掛在無限流上。
如果您只想知道,是否有匹配,您應該使用
list.stream().anyMatch(some predicate)
,不僅因為它更有效,而且因為它是表達你意圖的正確習慣list.stream().anyMatch(some predicate)
。
正如有人說, anyMatch
是短路,這意味着它會停在第一場比賽,而count
會,顧名思義,在返回之前計算所有比賽。 根據流內容,這可以產生巨大的性能差異。 但請注意,通過使用list.stream().filter(some predicate).limit(1).count() > 0
,您可以使count
效率相同list.stream().filter(some predicate).limit(1).count() > 0
然后,它也將在第一次出現后停止,但是, anyMatch
, anyMatch
仍然是表達您是否有任何匹配感興趣的首選方式。 當任務是要找出是否至少有 n
匹配時,事情會發生變化。 然后, .limit(n).count() > n-1
(或>= n
)成為自然的習語。
請注意, findFirst()
與其他解決方案不同,因為它的答案取決於排序。 因此,如果您只想知道是否匹配,則應使用findAny()
代替。 盡管如此,由於需要返回匹配值,與僅僅告知是否存在匹配相比,存在理論上的差異,就像anyMatch
那樣,盡管目前這種差異僅在於構造Optional
實例,因此可以忽略不計。
但是,由於您正在使用API編程以編碼您的意圖,因此當您只想知道是否存在匹配時,不應使用find…
anyMatch
清楚地表達了您的意圖,並可能在將來的實現或更復雜的場景中獲得更高的好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.