继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

轻松调试Stream

2019-10-13 14:47:097758浏览

张小喜

1实战 · 6手记 · 1推荐
TA的实战

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 实现高效编程 减少开发压力》

打开App,阅读手记
29人推荐
发表评论
随时随地看视频慕课网APP

热门评论

新手。。。想请教一下 -> 这是啥语法

好,不错,为什么要十个字,

很好的文章

查看全部评论