干货!如何使用 IntelliJ 调试 Java Streams代码

干货!如何使用 IntelliJ 调试 Java Streams代码

本篇文章笔者将带领读者学习如何用 IntelliJ 调试你的 Java Streams 代码,并洞察 Stream 的中间操作。本文例子用到的是 Sakila 样本数据库和 Speedment Stream ORM 框架。

一、原理

我们可以在 IntelliJ 为其创建一个基本的 Stream debugger:

干货!如何使用 IntelliJ 调试 Java Streams代码


这段代码创建了一个由字符串 “A”、“B”、“C”组成的 Stream,并且对这个 Stream 进行 sorted() 操作,从而产生了另外一个 Stream(至少在 Java 8-10 中是这样),所包含的元素是第一个 Stream 的元素按字母排序的结果,最后,这些将元素放到一个 List 中。

上面这段代码其实等同于下面的代码:

干货!如何使用 IntelliJ 调试 Java Streams代码


以上演示了 Stream debugger 如何工作。它将一个 stream 管道操作分割成多个代码片段,一步一步地调用中间运算操作,从而可以保留每一步操作的元素内容以供分析。

干货!如何使用 IntelliJ 调试 Java Streams代码


注意:真正的技术实现并不是上面这样,它只是提供了很好的概览。

在 IntelliJ’s debugger 中有更加形象化的表示:

干货!如何使用 IntelliJ 调试 Java Streams代码


它简洁明了地展示了 Stream 管道里的每个中间操作细节,以及最后结果。

二、调用

想调用 stream debugger 的话,首先要在 Stream 定义处设置断点:

干货!如何使用 IntelliJ 调试 Java Streams代码


然后,启动调试会话(以 debug 模式运行):

干货!如何使用 IntelliJ 调试 Java Streams代码


当到达断点时,可以按指定的按钮(可能有些不好找)来调用 Stream debugger,下面用红圈标出:

干货!如何使用 IntelliJ 调试 Java Streams代码


这样就打开了 stream debugger,和上文所展示的一样。

三、数据库 Streams

我将使用 Speedment(stream ORM),它允许通过标准的 Java Streams 操作来查询数据库,因此也能通过 IntelliJ 来调试操作。可以通过 Speedment initializer 来创建一个 Speedment 项目。

可以通过下面方式创建一个 Java 应用。

干货!如何使用 IntelliJ 调试 Java Streams代码


现在我们可以对数据库“film”表进行 stream 操作。下面是个例子:

干货!如何使用 IntelliJ 调试 Java Streams代码


代码将从所有 Film(电影) 对象中筛选出长度为 60 分钟的,然后通过 Film.RATING(评级)对这些 Film 对象进行排序(降序),最后将所有元素放入一个 List。

我们调用 Stream debugger 时,会看到下面这张图:

干货!如何使用 IntelliJ 调试 Java Streams代码


我们可以看到,初始 stream 中有 1000 部电影。筛选操作后,只剩 8 部电影,紧接着排序并放到一个 List。

四、计算统计

假设我们要计算所有 PG-13 级别(电影分级制度中的一种)电影的最小时长、最大时长以及平均时长。代码如下:

干货!如何使用 IntelliJ 调试 Java Streams代码


Stream debugger 展示如下:

干货!如何使用 IntelliJ 调试 Java Streams代码


可以看出,我们可以与 Stream debugger 交互,并在 stream 管道中点击元素来高亮显示,也可以在元素间滚动查看单个操作步骤。

Speedment 优化了数据库 Stream 中间操作,并将其融合进 SQL 查询。但使用 Stream debugger 时,优化并没有生效,以便让我们可以看到 Stream 管道中的所有操作步骤。


分享到:


相關文章: