流功能非常强大,只需几行就可以捕获您预期功能的要点。 但是,就像它们在一切正常工作时一样平滑,就像它们在表现不正常时一样令人痛苦。 了解如何使用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