使用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的调试器中看起来像这样:

IntelliJ

这样可以清晰,简洁地查看每个中间操作之间Stream管道内部发生的情况,并显示Stream的最终结果。

调用方式

通过首先设置定义了Stream的断点来调用流调试器:

IntelliJ

然后,启动调试会话:

IntelliJ

当遇到断点时,可以通过按下其指定的(可能是有些隐藏的)按钮来调用Stream调试器,如下面的红色圆圈所示:

IntelliJ

如本文前面所示,这将拉起流调试器。

数据库流

我将使用流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调试器时,将看到以下内容:

IntelliJ

可以看出,初始流中有1,000部电影。 在执行筛选操作之后,仅剩下8部影片,随后将其分类并收集到List

计算统计

假设我们要计算所有额定为PG-13电影的最小,最大和平均长度。 可以这样完成:

IntSummaryStatistics stat = films.stream()
    .filter(Film.RATING.equal("PG-13"))
    .mapToInt(Film.LENGTH.asInt())
    .summaryStatistics();

在Stream调试器中如下所示:

IntelliJ
可以看出,可以与流调试器进行交互并单击元素,从而突出显示它们在流管道中的路径。 也可以在各个步骤的元素之间滚动。

速度通常可以优化数据库Stream中的中间操作,并将这些步骤合并到SQL查询中。 但是,使用Stream调试器时,不会进行此类优化,并且我们能够看到流管道中的所有步骤。

结论

Stream调试器是一个隐藏的瑰宝,在使用Streams时可能会有很大帮助。

我认为IntelliJ团队提出了一个非常好的功能。

在此处下载Speedment。 在此处下载IntelliJ。

翻译自: https://www.javacodegeeks.com/2018/09/debugging-java-streams-with-intellij.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值