如何使用IntelliJ進行Java Streams調試
原理
讓我們從一個簡單的 Stream 開始,我們可以在 IntelliJ 為其建立一個基本的 Stream debugger:
.sorted()
.collect(toList());
# 上面的程式碼建立了一個由字串 “A”、“B”、“C”組成的 Stream。緊接著對這個 Stream 進行 sorted() 操作,從而創建了一個新的 Stream(至少在 Java 8-10 中是這樣),其中的元素是第一個 Stream 的元素按字母排序的結果。也就是說,第二個 Stream 包含「A」、「B」、「C」三個元素。最後,這些將元素放到一個 List 中。
Stream
#
Stream
#
List
這大體上示範了 Stream debugger 如何運作。它將一個 stream 管道操作分割成多個程式碼片段,一步一步地呼叫中間運算操作,從而可以保留每一步操作的元素內容以供分析。
Stream.of("C", "B", "A")
# .peek(saveStep(0))
.sorted()
.peek(saveStep(1))
.collect(toList()); // The final result is saved to step 2
注意:真正的技術實作並不是上面這樣,它只是提供了很好的概覽。
在 IntelliJ’s debugger 中有更形象化的表示:
它簡潔明了地展示了 Stream 管道裡的每個中間操作細節,以及最後結果。
呼叫
想呼叫 stream debugger 的話,首先要在 Stream 定義處設定斷點:
然後,啟動偵錯會話(以 debug 模式運行):
當到達斷點時,可以按下指定的按鈕(可能有些不好找)來呼叫 Stream debugger,下面用紅圈標示:
這樣就打開了 stream debugger,和上文所展示的一樣。
資料庫 Streams
我將使用 Speedment(stream ORM),它允許透過標準的 Java Streams 操作來查詢資料庫,因此也能透過 IntelliJ 來偵錯操作。可以透過 Speedment initializer 來創建一個 Speedment 專案。
可以透過下面方式建立一個 Java 應用程式。
Speedment app = new SakilaApplicationBuilder()
.withPassword("sakila-password") // Replace with your own password
# .build();
FilmManager films = app.getOrThrow(FilmManager.class);
現在我們可以對資料庫「film」表進行 stream 操作。下面是個例子:
List
.filter(Film.LENGTH.equal(60))
.sorted(Film.RATING.reversed())
# .collect(toList());
# 代碼將從所有 Film(影片) 物件中篩選出長度為 60 分鐘的,然後透過 Film.RATING(評級)對這些 Film 物件進行排序(降序),最後將所有元素放入一個 List。
當我們呼叫 Stream debugger 時,會看到下面這張圖:
我們可以看到,初始 stream 中有 1000 部電影。篩選操作後,只剩下 8 部電影,緊接著排序並放到一個 List。
計算統計
假設我們要計算所有 PG-13 等級(電影分級制度中的一種)電影的最小時長、最大時長以及平均時長。程式碼如下:
IntSummaryStatistics stat = films.stream()
# .filter(Film.RATING.equal("PG-13"))
# .mapToInt(Film.LENGTH.asInt())
# .summaryStatistics();
# 可以看出,我們可以與 Stream debugger 交互,並在 stream 管道中點擊元素來高亮顯示,也可以在元素間滾動查看單一操作步驟。
Speedment 最佳化了資料庫 Stream 中間操作,並將其整合進 SQL 查詢。但使用 Stream debugger 時,優化並沒有生效,以便讓我們可以看到 Stream 管道中的所有操作步驟。
以上是如何使用IntelliJ進行Java Streams調試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

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

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4
