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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1
強大的PHP整合開發環境