首頁 > Java > java教程 > 為什麼Java Stream的`filter()`在`flatMap()`之後有時會失去惰性?

為什麼Java Stream的`filter()`在`flatMap()`之後有時會失去惰性?

Patricia Arquette
發布: 2024-12-28 12:52:13
原創
563 人瀏覽過

Why Does Java Stream's `filter()` After `flatMap()` Sometimes Lose Laziness?

FlatMap 之後的Java 流過濾器並非完全惰性

Java 流提供了一種透過一系列轉換來處理資料管道的方法。中間操作通常是惰性的,這意味著它們在呼叫終端操作之前不會執行。然而,據觀察,在某些情況下,在 flatMap() 之後應用 filter() 可能會導致非惰性行為。

範例程式碼

考慮以下內容code:

System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);
System.out.println("-----------");
System.out.println(
        "Result: " +
                Stream.of(1, 2, 3)
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .flatMap(i -> Stream.of(i - 1, i, i + 1))
                        .filter(i -> {
                            System.out.println(i);
                            return true;
                        })
                        .findFirst()
                        .get()
);
登入後複製

輸出

1
Result: 1
-----------
-1
0
1
0
1
2
1
2
3
Result: -1
登入後複製

解釋

第一種情況,應用過濾操作在flatMap() 之前,導致惰性求值。評估在第一個匹配元素 (1) 處停止。

在第二種情況下,flatMap() 操作會建立一個包含九個元素 (-1, 0, 1, 0, 1, 2, 1) 的新流、2、3)。隨後的 filter() 操作將應用於每個元素,從而產生非惰性行為。儘管找到了匹配元素 (-1),評估仍會繼續處理流程中的所有元素。

修正

此問題已在 JDK-8075939 中解決並在 Java 10 中修復。它被向後移植到 Java 8 JDK-8225328.

該修復確保在存在 flatMap() 和 filter() 操作的情況下保持惰性計算。這意味著一旦找到匹配元素,評估就會立即終止。

影響

此修復解決了以下情況下非惰性行為可能引起的問題:使用 flatMap() 和 filter()。在需要提前終止的情況下,它提高了流管道的性能和正確性。

以上是為什麼Java Stream的`filter()`在`flatMap()`之後有時會失去惰性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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