技术分享:轻松调试Stream

2,523 阅读2分钟

  Java8新增的Stream、Lambda特性极大的方便了日常中对集合数据的处理过程,代码简洁优雅。但同时也引入了一个问题–难于调试!。本文列举了一些常见的Stream调试方法,供大家一起学习探讨。废话不多说,咱们开始!

  数据准备

  如下代码就是我们今天要研究的,比较简单:

  当我们想要调试filter方法的数据处理过程时,可能会比较费劲,因为filter中使用的Lambda表达式来处理的业务逻辑。下面列举了几种调试方法供大家参考。

  方法一:

  我们可以将原来一行的Lambda表达式改写为多行的形式,这样调试断点就可以打进去了。如下代码,调试断点可以打到第10行,从而进行调试。

  方法二:

  开发工具如果使用IDEA,在调试Lambda时断点可以选择打到本行上还是打到表达式上。

  


  鼠标点击78行添加断点时,会弹出三个选项,分别是调试本行、调试本行中Lambda表达式、调试全部。

  我们选择第二项,在调试的过程中就可以调试filter方法的Lambda表达式逻辑了。

  方法三:

  我们可以将Lambda表达式换成方法引用进行调试,改写程序为:

  首先我们定义了一个工具类,里面有一个静态方法是用来做业务逻辑判断的。

  然后使用方法引用的方式来改写程序。这样就可以在第11行中添加断点进行调试了。

  方法四:

  IDEA提供了一个插件用来观察Stream流的处理过程,叫做Java Stream Debugger。低版本的IDEA需要自己安装,高版本的已经默认集成了。

  

  打上断点后,点击Debug窗口的Trace Current Stream Chain图标,即可显示Stream处理的整体过程。方便我们跟踪每个数据项的处理情况。共提供了两种查看模式:Split Mode(全局视角),Flat Mode(扁平视角)。

  可以看一个真实的例子:

  


  全局视角下可以看到这个Stream做了一些列的处理,而数据项经过每一个环节的处理情况都能够被清晰的展示。

  方法五:

  为了方便观察每一步的执行情况,我们可以将每一步的执行结果利用peek方法进行打印。程序修改如下:

  第10行添加的打印语句不会对Stream处理造成影响,之后输出filter处理后的结果信息。千万不要在生产环境这样搞,会挨骂的!

  总结

  以上就是对调试Stream方法的总结,实际使用过程中可以灵活运用这几种方式调试代码。这样不但能写出优雅高效的代码,还能保证没有错误。