簡體   English   中英

Java 8的findFirst()。isPresent()是否比count()> 0更有效?

[英]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

然后,它也將在第一次出現后停止,但是, anyMatchanyMatch仍然是表達您是否有任何匹配感興趣的首選方式。 當任務是要找出是否至少有 n匹配時,事情會發生變化。 然后, .limit(n).count() > n-1 (或>= n )成為自然的習語。

請注意, findFirst()與其他解決方案不同,因為它的答案取決於排序。 因此,如果您只想知道是否匹配,則應使用findAny()代替。 盡管如此,由於需要返回匹配值,與僅僅告知是否存在匹配相比,存在理論上的差異,就像anyMatch那樣,盡管目前這種差異僅在於構造Optional實例,因此可以忽略不計。

但是,由於您正在使用API​​編程以編碼您的意圖,因此當您只想知道是否存在匹配時,不應使用find… anyMatch清楚地表達了您的意圖,並可能在將來的實現或更復雜的場景中獲得更高的好處。

findAny (如果你不需要命令,它優於findFirst )和anyMatch短路操作 ,這意味着如果條件允許,它們可以提前返回而不消耗整個流。 這是在他們的方法javadocs中提到並鏈接的。 count() 不是

如果流的最后階段仍使用具有SIZED特征的分裂器,則count() 可能與其他兩個選項一樣快。 但這是一個比短路更弱的特性,因為中間流操作 - 例如filter() - 很可能會丟棄SIZED方面。

所有這些信息都可以從包文檔中收集,強烈建議閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM