乾貨!如何使用 IntelliJ 調試 Java Streams代碼

乾貨!如何使用 IntelliJ 調試 Java Streams代碼

本篇文章筆者將帶領讀者學習如何用 IntelliJ 調試你的 Java Streams 代碼,並洞察 Stream 的中間操作。本文例子用到的是 Sakila 樣本數據庫和 Speedment Stream ORM 框架。

一、原理

我們可以在 IntelliJ 為其創建一個基本的 Stream debugger:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


這段代碼創建了一個由字符串 “A”、“B”、“C”組成的 Stream,並且對這個 Stream 進行 sorted() 操作,從而產生了另外一個 Stream(至少在 Java 8-10 中是這樣),所包含的元素是第一個 Stream 的元素按字母排序的結果,最後,這些將元素放到一個 List 中。

上面這段代碼其實等同於下面的代碼:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


以上演示了 Stream debugger 如何工作。它將一個 stream 管道操作分割成多個代碼片段,一步一步地調用中間運算操作,從而可以保留每一步操作的元素內容以供分析。

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


注意:真正的技術實現並不是上面這樣,它只是提供了很好的概覽。

在 IntelliJ’s debugger 中有更加形象化的表示:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


它簡潔明瞭地展示了 Stream 管道里的每個中間操作細節,以及最後結果。

二、調用

想調用 stream debugger 的話,首先要在 Stream 定義處設置斷點:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


然後,啟動調試會話(以 debug 模式運行):

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


當到達斷點時,可以按指定的按鈕(可能有些不好找)來調用 Stream debugger,下面用紅圈標出:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


這樣就打開了 stream debugger,和上文所展示的一樣。

三、數據庫 Streams

我將使用 Speedment(stream ORM),它允許通過標準的 Java Streams 操作來查詢數據庫,因此也能通過 IntelliJ 來調試操作。可以通過 Speedment initializer 來創建一個 Speedment 項目。

可以通過下面方式創建一個 Java 應用。

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


現在我們可以對數據庫“film”表進行 stream 操作。下面是個例子:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


代碼將從所有 Film(電影) 對象中篩選出長度為 60 分鐘的,然後通過 Film.RATING(評級)對這些 Film 對象進行排序(降序),最後將所有元素放入一個 List。

我們調用 Stream debugger 時,會看到下面這張圖:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


我們可以看到,初始 stream 中有 1000 部電影。篩選操作後,只剩 8 部電影,緊接著排序並放到一個 List。

四、計算統計

假設我們要計算所有 PG-13 級別(電影分級制度中的一種)電影的最小時長、最大時長以及平均時長。代碼如下:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


Stream debugger 展示如下:

乾貨!如何使用 IntelliJ 調試 Java Streams代碼


可以看出,我們可以與 Stream debugger 交互,並在 stream 管道中點擊元素來高亮顯示,也可以在元素間滾動查看單個操作步驟。

Speedment 優化了數據庫 Stream 中間操作,並將其融合進 SQL 查詢。但使用 Stream debugger 時,優化並沒有生效,以便讓我們可以看到 Stream 管道中的所有操作步驟。


分享到:


相關文章: