Java8新增的Stream、Lambda特性极大的方便了日常中对集合数据的处理过程,代码简洁优雅。但同时也引入了一个问题–难于调试!。本文列举了一些常见的Stream调试方法,供大家一起学习探讨。废话不多说,咱们开始!
数据准备
如下代码就是我们今天要研究的,比较简单:
@Test
public void debug() {
// 数据源
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
// 过滤出大于3的数据项
.filter(item -> item > 3)
// 打印每个数据项
.forEach(System.out::println);
}
当我们想要调试filter方法的数据处理过程时,可能会比较费劲,因为filter中使用的Lambda表达式来处理的业务逻辑。下面列举了几种调试方法供大家参考。
方法一:
我们可以将原来一行的Lambda表达式改写为多行的形式,这样调试断点就可以打进去了。如下代码,调试断点可以打到第10行,从而进行调试。
@Test
public void debug() {
// 数据源
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
// 过滤出大于3的数据项 - 将Lambda表达式拆分为多行形式
.filter(item -> {
// 获取比较结果
boolean test = item > 3;
// 返回比较结果
return test;
})
// 打印每个数据项
.forEach(System.out::println);
}
方法二:
开发工具如果使用IDEA,在调试Lambda时断点可以选择打到本行上还是打到表达式上。
鼠标点击78行添加断点时,会弹出三个选项,分别是调试本行、调试本行中Lambda表达式、调试全部。
我们选择第二项,在调试的过程中就可以调试filter方法的Lambda表达式逻辑了。
方法三:
我们可以将Lambda表达式换成方法引用进行调试,改写程序为:
/**
* 工具类
*/
static class CustomerPredicate {
/**
* 静态方法
* @param item
* @return
*/
static boolean test(Integer item) {
return item > 3;
}
}
@Test
public void debug() {
// 数据源
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
// 过滤出大于3的数据项 - 使用方法引用的方式
.filter(CustomerPredicate::test)
// 打印每个数据项
.forEach(System.out::println);
}
首先我们定义了一个工具类,里面有一个静态方法是用来做业务逻辑判断的。
然后使用方法引用
的方式来改写程序。这样就可以在第11行中添加断点进行调试了。
方法四:
IDEA提供了一个插件用来观察Stream流的处理过程,叫做Java Stream Debugger
。低版本的IDEA需要自己安装,高版本的已经默认集成了。
打上断点后,点击Debug窗口的Trace Current Stream Chain图标,即可显示Stream处理的整体过程。方便我们跟踪每个数据项的处理情况。共提供了两种查看模式:Split Mode(全局视角),Flat Mode(扁平视角)。
可以看一个真实的例子:
全局视角下可以看到这个Stream做了一些列的处理,而数据项经过每一个环节的处理情况都能够被清晰的展示。
方法五:
为了方便观察每一步的执行情况,我们可以将每一步的执行结果利用peek方法进行打印。程序修改如下:
@Test
public void debug() {
// 数据源
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
// 过滤出大于3的数据项
.filter(item -> item > 3)
// 打印filter之后的结果
.peek(System.out::println)
// 打印每个数据项
.forEach(System.out::println);
}
第10行添加的打印语句不会对Stream处理造成影响,之后输出filter处理后的结果信息。千万不要在生产环境这样搞,会挨骂的!
以上就是对调试Stream方法的总结,实际使用过程中可以灵活运用这几种方式调试代码。这样不但能写出优雅高效的代码,还能保证没有错误。
最后安利一下我的新课,如果想系统学习Lambda,Stream或想提高开发效率的伙伴,可以关注一下课程:《告别996 实现高效编程 减少开发压力》:
热门评论
新手。。。想请教一下 -> 这是啥语法
好,不错,为什么要十个字,
很好的文章