使用IntelliJ调试Java流
流功能非常強大,只需幾行就可以捕獲您預期功能的要點。 但是,就像它們在一切正常工作時一樣平滑,就像它們在表現不正常時一樣令人痛苦。 了解如何使用IntelliJ調試Java Streams并深入了解Stream的中間操作。
在本文中,我將在示例中使用Sakila示例數據庫和Speedment Stream ORM 。
原則
讓我們從一個簡單的Stream開始,我們可以使用它在IntelliJ中建立Stream調試器的基礎知識:
List<String> strings = Stream.of("C", "A", "B").sorted().collect(toList()); 上面的代碼首先創建一個初始Stream ,該初始Stream由
String元素"C", "A", "B" 。 然后,將中間操作sorted()應用于第一個Stream ,從而(至少在Java 8-10中)創建一個新的Stream ,其中初始流中的元素根據其自然順序進行排序。 即第二個流將包含元素"A", "B", "C" 。 最后,將這些元素收集到List 。
上面的代碼等效于:
Stream<String> s0 = Stream.of("C", "B", "A"); // "C", "A", "B" Stream<String> s1 = s0.sorted(); // "A", "B", "C" List<String> strings = s1.collect(toList()); // [“A”, “B”, “C”]基本上,這就是Stream調試器的操作方式。 它將流管道分成較小的段,并逐步調用不同的中間運算符,同時保留所分析的每個步驟的元素:
Stream.of("C", "B", "A").peek(saveStep(0)).sorted().peek(saveStep(1)).collect(toList()); // The final result is saved to step 2注意:這在技術上并不完全正確,但是它提供了一個很好的總體輪廓。
在外觀上,在IntelliJ的調試器中看起來像這樣:
這樣可以清晰,簡潔地查看每個中間操作之間Stream管道內部發生的情況,并顯示Stream的最終結果。
調用方式
通過首先設置定義了Stream的斷點來調用流調試器:
然后,啟動調試會話:
當遇到斷點時,可以通過按下其指定的(可能是有些隱藏的)按鈕來調用Stream調試器,如下面的紅色圓圈所示:
如本文前面所示,這將拉起流調試器。
數據庫流
我將使用流ORM Speedment,該流允許使用標準Java流查詢數據庫,因此,也可以使用IntelliJ調試這些流。 可以使用Speedment 初始化程序設置一個Speedment項目。
Java應用程序本身可以這樣設置:
Speedment app = new SakilaApplicationBuilder().withPassword("sakila-password") // Replace with your own password.build();FilmManager films = app.getOrThrow(FilmManager.class);現在,我們可以流式傳輸數據庫表“ film”。 例如這樣:
List<Film> map = films.stream().filter(Film.LENGTH.equal(60)).sorted(Film.RATING.reversed()).collect(toList()); 這將過濾掉所有Film具有長度對象等于60分鐘,然后進行排序那些Film根據對象
Film.RATING (降序),然后將這些元素收集到List 。
調用Stream調試器時,將看到以下內容:
可以看出,初始流中有1,000部電影。 在執行篩選操作之后,僅剩下8部影片,隨后將其分類并收集到List 。
計算統計
假設我們要計算所有額定為PG-13電影的最小,最大和平均長度。 可以這樣完成:
IntSummaryStatistics stat = films.stream().filter(Film.RATING.equal("PG-13")).mapToInt(Film.LENGTH.asInt()).summaryStatistics();在Stream調試器中如下所示:
可以看出,可以與流調試器進行交互并單擊元素,從而突出顯示它們在流管道中的路徑。 也可以在各個步驟的元素之間滾動。
速度通常可以優化數據庫Stream中的中間操作,并將這些步驟合并到SQL查詢中。 但是,使用Stream調試器時,不會進行此類優化,并且我們能夠看到流管道中的所有步驟。
結論
Stream調試器是一個隱藏的瑰寶,在使用Streams時可能會有很大幫助。
我認為IntelliJ團隊提出了一個非常好的功能。
在此處下載Speedment。 在此處下載IntelliJ。
翻譯自: https://www.javacodegeeks.com/2018/09/debugging-java-streams-with-intellij.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的使用IntelliJ调试Java流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓机通讯录导入苹果机(安卓机通讯录导入
- 下一篇: Apache Ignite变得简单:第一