IDEA-Stram调试

前言

JAVA8的lambda的stream编程,给我们带来了很流畅(牛逼)的编程体验,但带来的问题也很明显:

下面粘贴一张博猪一个日常的代码片段:

image-20210516222157802.png

上面代码看着很简洁(zhaungbi),但是带来的问题也很直接:

  • 方法可读性不好
  • 调试困难,无法知道流程周转

下面博猪给大家介绍一个博猪日常写stream时常用的一个神器:==Stream-Trance==,一个IDEA自带的调试神器,这个工具可以详细看到每一步操作的关系、结果,非常方便进行调试。

Stream调试

下面通过一个Demo,让博猪给你演示一下神器是如何使用的。首先给大家贴一下没有注释的代码(很装逼的代码)。

1
2
3
4
5
6
7
8
List<Integer> list = Arrays.asList(45,56,23,89,34,78,56);
Map<Boolean, List<Integer>> collect = list.stream()
.filter(i -> i * 2 > 60)
.sorted()
.map(i -> i - 10)
.distinct()
.collect(Collectors.groupingBy(i -> i >= 50, Collectors.toList()));
System.out.println(collect);

下面博猪贴一下有注释的代码,顺便理一下这一块的代码的流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//初始化数组
List<Integer> list = Arrays.asList(45, 56, 23, 89, 34, 78, 56);
Map<Boolean, List<Integer>> collect = list.stream()
//过滤 当前数字*2后大于60的,结果:[45,56,89,34,78,56]
.filter(i -> i * 2 > 60)
//默认排序,结果:[34,45,56,56,78,89]
.sorted()
//每个值-10,成一个map:结果:{24,35,46,46,68,79}
.map(i -> i - 10)
//去重,结果:{24,35,46,68,79}
.distinct()
//大于五十的分组,输出一个Map<Boolean,Collection>,结果:{false=[24, 35, 46], true=[68, 79]}
.collect(Collectors.groupingBy(i -> i >= 50, Collectors.toList()));
System.out.println(collect);

上面这段代码算是流程比较长的了,当然实际工作中可能遇到比这个还要复杂的,那博猪演示一下日常是怎么调试Stream流程的。

  • 在Stream那行打上断点。点击debug运行。

image-20210516224707120.png

  • 点击下方按钮

image-20210516224817756.png

  • 然后自动进入当前 Stream ​跟踪调试窗口,默认Split 模式显示,上面会展示每个链式调用的选项卡,点击各个选项卡可以看对应每步的跟踪结果。如下面所示:

    • 初始流

    image-20210516224947403.png

    • 过滤

    image-20210516225139631.png

    • 排序

    image-20210516225158100.png

    • 转map

    image-20210516225215527.png

    • 去重

    image-20210516225230717.png

    • 结果

    image-20210516225249902.png

  • 还可以点击Flat Mode,查看完整的流程的运转

image-20210516225407829.png

链式调试

上方详细介绍了一下Stream的调试,但是平时也是使用一些Lambda的链式编程,那上述方法是否支持呢?

比如下方代码:

1
2
3
4
String str = Optional.of("will")
.map(s -> s + " hello")
.map(s -> s + " world!").get();
System.out.println(str);

OK,我们按照上方进行调试,调试图如下方所示:

image-20210516230237419.png

可惜, Trace Current Stream Chain ​按钮是灰色状态,不能进入,因为那个按钮只能被 Stream ​调试所用。

那像这种非 Stream 链式调用怎么调试呢?

断点进入后,可以选中需要调试的部分链式代码片断,然后右键选中 Evaluate Expression ​菜单(ALT + F8)进入表达式计算窗口,点击 Evaluate ​按钮开始计算:

image-20210516230402779.png

image-20210516230429818.png

计算无误,该表达式还可以自由编辑,非常强大。虽然没有像 Stream ​这样专属的调试面板,使用 Evaluate Expression ​也能达到调试链式调用的目的


IDEA-Stram调试
https://github.com/yangxiangnanwill/yangxiangnanwill.github.io/2024/01/03/好好码代码吖/工具/IDEA-Stram调试/
作者
will
发布于
2024年1月3日
许可协议