Java8使用Stream的缺點是除錯困難?教你一招你就不會這麼認為了

今天給大家分享如何在 IntellJ IDEA 中除錯 Java8 帶來牛逼哄哄的的新特性 Stream。

寫在前面

Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理集合資料。Stream API可以極大提高Java程式設計師的生產力,讓我們寫出高效率、乾淨、簡潔的程式碼。

這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。元素流在管道中經過中間操作(intermediate operation)的處理,最後由最終操作(terminal operation)得到前面處理的結果。

+——————————+ +————+ +————+ +——-+ +————-+| stream of elements +——-> |filter+-> |sorted+-> |map+-> |collect|+——————————+ +————+ +————+ +——-+ +————-+

以上的流程轉換為 Java 程式碼為:

List transactionsIds = widgets。stream() 。filter(b -> b。getColor() == RED) 。sorted((x,y) -> x。getWeight() - y。getWeight()) 。mapToInt(Widget::getWeight) 。sum();

Java 程式碼這樣寫,表達的意思也很明確,書寫起來不要太流暢哦~

反正自從我們專案組升級到 Java8 後,一般涉及到集合遍歷、元素轉換、過濾、排序、統計,我反手就是一個 Stream。身邊同事基本上也都是這麼用的,因為書寫起來實在太流暢了,feel倍兒爽~

痛點

之前我面試阿里的時候,二面的面試官就問到 Java8 都有哪些新特性呢?其中我就提到了 Java8 帶來的 Stream,然後他就問缺點是什麼?我回答寫的程式碼難以除錯,因為不像for迴圈那樣可以每一行打斷點除錯了。

Java7中我們計算空字串的數量可以使用如下程式碼:

// 計算空字串List strings = Arrays。asList(“abc”, “”, “bc”, “efg”, “abcd”, “”, “jkl”);System。out。println(“列表: ” + strings);int count = 0;for (String string : strings) { if (string。isEmpty()) { count++; }}return count;

除錯的時候直接在迴圈中打上斷點,以Debug方式執行,就可以跟蹤程式碼的執行流程了:

Java8使用Stream的缺點是除錯困難?教你一招你就不會這麼認為了

來,我們再看下Java8中的實現程式碼:

System。out。println(“使用 Java 8: ”);count = strings。stream()。filter(string -> string。isEmpty())。count();System。out。println(“空字串數量為: ” + count);

就一行程式碼,我們需要怎麼打斷點除錯呢?

Java8使用Stream的缺點是除錯困難?教你一招你就不會這麼認為了

如上圖所示,在 Stream 程式碼的這一行打斷點,如果你選擇 Line ,那麼就無法除錯,跟蹤不到Stream在管道中傳輸以及在管道的節點上進行的filter處理動作。

選擇斷點加在 lambda表示式上,然後使用單步除錯才可以進入,不得不說 IDEA 是真的強。我印象中之前使用2019版本打斷點是沒有出現這個提示的,反正2020以上的版本肯定都有了,打斷點的時候就會提示選擇。

雖然可以除錯,問題是可以解決了,不過還不夠強,接下來大家別眨眼睛,一個更強大、更直觀的檢視,幫助我們一眼就能看出 Stream 的處理過程。

視覺化追蹤 Stream 鏈

步驟還是上面的一樣,打斷點,以Debug的方式執行程式,區別在於打斷點時無需選擇是行端點還是lambda表示式上面,隨便選擇只要打上斷點即可:

Java8使用Stream的缺點是除錯困難?教你一招你就不會這麼認為了

點選圖中按鈕,就會自動開啟一個Stream處理流程的檢視,整個處理過程變得一目瞭然,檢視分為三分部,左邊是初始集合的資料,中間是Stream處理過濾後的資料,右邊是最終操作得到的處理結果。

Java8使用Stream的缺點是除錯困難?教你一招你就不會這麼認為了

這樣Java8 Stream 相關的API( 篩選, 排序,聚合)操作就都可以視覺化的展示出來了,除錯時非常的方便,排查問題豈不是一眼就看到問題所在了。你說這個玩意香不香呢?

寫在最後

透過今天的分享,對於Java8引入的Stream相關API使用起來就更加舒服了吧,不僅寫起來爽,排查問題也木有任何障礙了。一看就能掌握,你覺得這個玩意是否有用呢?歡迎評論區發表你的高見