首頁 > Java > java教程 > 為什麼 Java Streams 中 `flatMap()` 之後的 `filter()` 不總是惰性的?

為什麼 Java Streams 中 `flatMap()` 之後的 `filter()` 不總是惰性的?

DDD
發布: 2024-12-11 19:17:13
原創
947 人瀏覽過

Why Isn't `filter()` After `flatMap()` Always Lazy in Java Streams?

為什麼在Java Streams 中,filter() 在flatMap() 之後並不是完全惰性的

在Java Streams 中,filter( ) 被認為是惰性的操作,這意味著它不會立即執行,而是在消費時執行。然而,當filter()跟隨flatMap()時,它的行為就偏離了真正的惰性。

示範

考慮下面的程式碼:

在此範例中,filter() 套用於整數流。輸出顯示僅對第一個元素呼叫過濾函數,如延遲求值中所預期的。

但是,在以下程式碼中:

filter( ) 函數應用於透過應用兩個 flatMap() 操作產生的流。儘管展平流中的第一個元素滿足過濾條件,但仍會繼續對剩餘元素呼叫過濾函數。

說明

出現此行為的原因是 flatMap() 為原始流中的每個元素建立一個新流。雖然 filter() 仍然是惰性操作,但展平操作不支援提前終止。因此,展平過程一旦開始,就無法中斷,即使稍後在流中滿足過濾條件也是如此。

影響

此行為可能會導致意外的結果後果,特別是在處理無限流時。例如,如果 flatMap() 操作的輸入流是無限的,則 filter() 操作將無限期地嘗試應用其功能,即使它保證永遠找不到匹配的元素。

JDK 修復

此處描述的問題已在 Java 10 中解決(並向後移植到 Java 8)。在這些版本中,flatMap() 已經過最佳化以支援提前終止,確保 filter() 和其他惰性操作的行為保持一致,無論它們是否遵循 flatMap()。

以上是為什麼 Java Streams 中 `flatMap()` 之後的 `filter()` 不總是惰性的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板