第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

輕松調(diào)試Stream

標(biāo)簽:
Java

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

點(diǎn)擊查看更多內(nèi)容
29人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消