1. 程式人生 > >IntelliJ IDEA 除錯 Java 8 Stream,實在太香了!

IntelliJ IDEA 除錯 Java 8 Stream,實在太香了!

前段時間,棧長髮布了一篇關於 [Java 8 Optional.map](https://mp.weixin.qq.com/s/UYBLw17wVL6baBpjFRkySQ) 的實用文章,留言區就有的人說 Java 8 的語法糖不方便除錯,還要視情況使用。 ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095904293-1141036832.png) 留言區也有人說 IntelliJ IDEA 早已支援 Java 8 `Stream` 除錯,因為我平時也很少除錯,那麼我就以 IntelliJ IDEA 來演示下如何除錯 Java 8 中的 `Stream` 鏈式呼叫吧。 先寫一段 Java 8 `Stream` 示例: ``` /* * 來源公眾號:Java技術棧 */ public static void main(String[] args) { Stream.of(100, 200, 300, 400, 500) .mapToLong(e -> e * 10) .filter(e -> e > 2000) .forEach(System.out::println); } ``` 這裡只演示了一種 `Stream` 建立方式,Java 8 建立 `Stream` 的 10 種方式請點選[這裡](https://mp.weixin.qq.com/s/dX37qjXHoNDnfyHDOUIWTA)進行閱讀。 > 這個程式是先構建一個 5 個數字的 Stream, 然後再對每個數字 * 10,再篩選出大於 2000 的數字進行列印。 **如何除錯每個鏈式呼叫的過程呢?** 先在第一行打個斷點,然後進入除錯模式執行,當斷點進入時,點選除錯視窗的 `Trace Current Stream Chain` 按鈕: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095904636-1954954848.png) 然後自動進入當前 `Stream` 跟蹤除錯視窗,上面會展示每個鏈式呼叫的選項卡,點選各個選項卡可以看對應每步的跟蹤結果。 如下面所示: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095904903-1584628104.png) ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095905177-552343724.png) ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095905398-190604999.png) 也可以點選左下角的 `Flat Mode` 進入扁平模式,一次性展示所有跟蹤結果: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095905619-1489612456.png) OK,Java 8 `Stream` 的除錯不是問題了, 但我並沒有找到像 `Optional` 鏈式呼叫的除錯方式。 比如下面一段 `Optional` 示例: ``` /* * 來源公眾號:Java技術棧 */ public static void main(String[] args) { String string = Optional.of("hi,") .map(e -> e + "Java") .map(e -> e + "技術") .map(e -> e + "棧").get(); System.out.println(string); } ``` 除錯如圖所示: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095905765-1616137602.png) 可惜,`Trace Current Stream Chain` 按鈕是灰色狀態,不能進入,因為那個按鈕只能被 `Stream` 除錯所用。 **那像這種非 Stream 鏈式呼叫怎麼除錯呢?** 斷點進入後,可以選中需要除錯的部分鏈式程式碼片斷,然後右鍵選中 `Evaluate Expression` 選單(ALT + F8)進入表示式計算視窗: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095905969-1520666855.png) ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095906163-903081494.png) 點選 `Evaluate` 按鈕開始計算: ![](https://img2020.cnblogs.com/other/1218593/202010/1218593-20201009095906347-1307866811.png) 計算無誤,該表示式還可以自由編輯,非常強大。 雖然沒有像 `Stream` 這樣專屬的除錯面板,使用 `Evaluate Expression` 也能達到除錯鏈式呼叫的目的吧。關於這個,你還有其他除錯方案麼?歡迎留言分享! 好了,本次的分享就到這裡了,希望對大家有用。覺得不錯,在看、轉發分享一下哦~ 關注Java技術棧微信公眾號,棧長將繼續分享好玩的 Java 技術,公眾號第一時間推送,在公眾號後臺回覆:IDEA,可以獲取歷史 IDEA 教程,都是乾貨。 **近期熱文推薦:** 1.[Java 15 正式釋出, 14 個新特性,重新整理你的認知!!](http://www.javastack.cn/article/2020/java15-released/) 2.[終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!](http://www.javastack.cn/article/2020/intellij-idea-by-open-source-project/) 3.[我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。](http://www.javastack.cn/article/2020/java-8-optional-map-do-you-know/) 4.[吊打 Tomcat ,Undertow 效能很炸!!](http://www.javastack.cn/article/2020/undertow-introduce-with-spring-boot/) 5.[《Java開發手冊(嵩山版)》最新發布,速速下載!](http://www.javastack.cn/article/2020/alibaba-release-java-develop-rules-songshan/) 覺得不錯,別忘了隨手點贊+轉