分析Java Stream操作
最后修改时间:2023 年 1 月 17 日调试工具窗口:查看 | 工具窗口 | 调试或Alt05
Java 8 Streams 有时可能难以调试。发生这种情况是因为它们要求您插入额外的断点并彻底分析流内的每个转换。IntelliJ IDEA 提供了一个解决方案,让您可视化 Java Stream 操作中发生的情况。
笔记
此功能仅适用于项目文件。Java Stream 调试器不适用于库或反编译代码。
让我们用一个以函数式风格编写的简单程序来演示该功能的工作原理。
import java.util.stream.IntStream;
class PrimeFinder {
static int skip = 0;
static int limit = 100;
public static void main(String[] args) {
if (args.length >= 1) skip = Integer.parseInt(args[0]);
if (args.length >= 2) limit = Integer.parseInt(args[1]);
IntStream.iterate(1, n -> n + 1)
.skip(skip)
.limit(limit)
.filter(PrimeTest::isPrime)
.forEach(System.out::println);
}
}
class PrimeTest {
static boolean isPrime(int candidate) {
return candidate == 91 || // a bug here
IntStream.rangeClosed(2, (int) Math.sqrt(candidate))
.noneMatch(n -> (candidate % n == 0));
}
}
顾名思义,该PrimeFinder
应用程序可以查找素数。您可以使用程序参数指定起始编号和要检查的候选者数量。检查逻辑由 Java 8 Stream 处理。
现在,如果我们查看程序输出,我们会看到额外的数字。
79
83
89
91 <- extra
97
尽管函数式风格可能很简洁,但调试起来并不总是那么容易。要了解这些错误数字的来源,请使用流调试器功能。
在使用流的行挂起程序。您可以为此使用任何流操作,包括终端操作。
单击“调试”工具窗口中的“跟踪当前流链”按钮。
使用“流跟踪”对话框来分析流内的操作。顶部的选项卡可让您在特定操作之间切换,并查看每个操作的值如何转换。
如果您想鸟瞰整个流,请单击“平面模式”。
提示
没有返回值的终端操作
forEach
不会在平面模式下显示。
对流的检查为我们提供了有关问题原因的线索。我们传递了一个方法引用filter
,它返回了一个额外的值。bug 的搜索现在缩小到操作的范围Predicate
,filter
即PrimeTest.isPrime()
方法。
请注意,流跟踪不会超出流的终端操作。这意味着如果有进一步的链接,例如使用,则从“流跟踪”Optional
对话框中将看不到它。
感谢您的反馈意见!
此页面是否有帮助?