原文: https://www.toutiao.com/a6962762107330822668/

前言

开发工作中,没有谁不会用到 debug 调试吧?对于 java8 中 stream 流的调试你们又是怎么 debug 的呢?譬如下面这一段代码,你们是不是打个断点,按 F6 一步一步的看呢?如果里面的循环比较少的情况,这种 debug 还可以接受,如果循环比较多的话,可能心里就有点烦了。

  1. @Test
  2. public void c_2() {
  3. List<Integer> collect = Stream.of(1, 2, 3, 4, 5, 6)
  4. .filter(i -> i % 2 == 0)
  5. .filter(i -> i > 3)
  6. .collect(Collectors.toList());
  7. }

idea 调试技巧

就拿上面那段代码做示例,我们在这段代码上打一个断点,idea 中会弹出几个选项,我们就选择行断点,如图 1;

idea调试java8 stream流的小技巧 - 图1

图 1

接着以 debug 方式启动,那么断点就会进来;再接着点击 idea 中 trace current stream chain 按钮,如下图 2;

idea调试java8 stream流的小技巧 - 图2

图 2

这时我们就会看到图 3 的样子;

idea调试java8 stream流的小技巧 - 图3

图 3

其中,第一个框里面的内容就是最原始的数据,第一个 filter 就是过滤掉条件后符合的结果,见图 4;第二个 filter 就是以第一个 filter 过滤后的结果为原始数据再过滤的结果,见图 5;最后 collect 就是最终得到的数据,见图 6。

idea调试java8 stream流的小技巧 - 图4

图 4

idea调试java8 stream流的小技巧 - 图5

图 5

idea调试java8 stream流的小技巧 - 图6

图 6

当然,我们可以点击 flat mode 按钮,这样可以更直观的观察到数据的变化,见图 7;

idea调试java8 stream流的小技巧 - 图7

图 7

那有人说了,你这是简单的数据类型,复杂的数据类型也能调试吗?

当然可以!道理都是一样的。如下,现在集合中有一批学生,现在想筛选出名字中含字母 s 的并且年龄大于 15 的。

  1. Student s1 = new Student("zs", 18);
  2. Student s2 = new Student("ls", 34);
  3. Student s3 = new Student("ww", 23);
  4. Student s4 = new Student("wr", 15);
  5. Student s5 = new Student("ln", 16);
  6. List<Student> list = new ArrayList<>();
  7. list.add(s1);
  8. list.add(s2);
  9. list.add(s3);
  10. list.add(s4);
  11. list.add(s5);
  12. List<Student> stu = list.stream().filter(s -> s.getName().contains("s")).filter(s -> s.getAge() > 15).distinct().collect(Collectors.toList());
  13. System.out.println(stu);

在 13 行这里打断点,debug 运行后,打开流的追踪,可以看到图 8 的结果。

idea调试java8 stream流的小技巧 - 图8