前言
开发工作中,没有谁不会用到 debug 调试吧?对于 java8 中 stream 流的调试你们又是怎么 debug 的呢?譬如下面这一段代码,你们是不是打个断点,按 F6 一步一步的看呢?如果里面的循环比较少的情况,这种 debug 还可以接受,如果循环比较多的话,可能心里就有点烦了。
@Test
public void c_2() {
List<Integer> collect = Stream.of(1, 2, 3, 4, 5, 6)
.filter(i -> i % 2 == 0)
.filter(i -> i > 3)
.collect(Collectors.toList());
}
idea 调试技巧
就拿上面那段代码做示例,我们在这段代码上打一个断点,idea 中会弹出几个选项,我们就选择行断点,如图 1;
图 1
接着以 debug 方式启动,那么断点就会进来;再接着点击 idea 中 trace current stream chain 按钮,如下图 2;
图 2
这时我们就会看到图 3 的样子;
图 3
其中,第一个框里面的内容就是最原始的数据,第一个 filter 就是过滤掉条件后符合的结果,见图 4;第二个 filter 就是以第一个 filter 过滤后的结果为原始数据再过滤的结果,见图 5;最后 collect 就是最终得到的数据,见图 6。
图 4
图 5
图 6
当然,我们可以点击 flat mode 按钮,这样可以更直观的观察到数据的变化,见图 7;
图 7
那有人说了,你这是简单的数据类型,复杂的数据类型也能调试吗?
当然可以!道理都是一样的。如下,现在集合中有一批学生,现在想筛选出名字中含字母 s 的并且年龄大于 15 的。
Student s1 = new Student("zs", 18);
Student s2 = new Student("ls", 34);
Student s3 = new Student("ww", 23);
Student s4 = new Student("wr", 15);
Student s5 = new Student("ln", 16);
List<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
list.add(s5);
List<Student> stu = list.stream().filter(s -> s.getName().contains("s")).filter(s -> s.getAge() > 15).distinct().collect(Collectors.toList());
System.out.println(stu);
在 13 行这里打断点,debug 运行后,打开流的追踪,可以看到图 8 的结果。