為什麼在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中文網其他相關文章!