Java8使用Stream的缺点是调试困难?教你一招你就不会这么认为了

开发 后端
今天给大家分享如何在 IntellJ IDEA 中调试 Java8 带来牛逼哄哄的的新特性 Stream。

今天给大家分享如何在 IntellJ IDEA 中调试 Java8 带来牛逼哄哄的的新特性 Stream。

写在前面

Java8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理集合数据。Stream API可以极大提高Java程序员的生产力,让我们写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

 

  1. +--------------------+       +------+   +------+   +---+   +-------+ 
  2. | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| 
  3. +--------------------+       +------+   +------+   +---+   +-------+ 

以上的流程转换为 Java 代码为:

  1. List<Integer> transactionsIds =  
  2. widgets.stream() 
  3.              .filter(b -> b.getColor() == RED) 
  4.              .sorted((x,y) -> x.getWeight() - y.getWeight()) 
  5.              .mapToInt(Widget::getWeight) 
  6.              .sum(); 

Java 代码这样写,表达的意思也很明确,书写起来不要太流畅哦😯~

反正自从我们项目组升级到 Java8 后,一般涉及到集合遍历、元素转换、过滤、排序、统计,我反手就是一个 Stream。身边同事基本上也都是这么用的,因为书写起来实在太流畅了,feel倍儿爽~

痛点

之前我面试阿里的时候,二面的面试官就问到 Java8 都有哪些新特性呢?其中我就提到了 Java8 带来的 Stream,然后他就问缺点是什么?我回答写的代码难以调试,因为不像for循环那样可以每一行打断点调试了。

Java7中我们计算空字符串的数量可以使用如下代码:

  1. // 计算空字符串 
  2. List<String> strings = Arrays.asList("abc""""bc""efg""abcd""""jkl"); 
  3. System.out.println("列表: " + strings); 
  4. int count = 0; 
  5. for (String string : strings) { 
  6.     if (string.isEmpty()) { 
  7.         count++; 
  8.     } 
  9. return count

调试的时候直接在循环中打上断点,以Debug方式运行,就可以跟踪代码的执行流程了:

 

 

 

 

来,我们再看下Java8中的实现代码:

 

  1. System.out.println("使用 Java 8: "); 
  2. count = strings.stream().filter(string -> string.isEmpty()).count(); 
  3. System.out.println("空字符串数量为: " + count); 

就一行代码,我们需要怎么打断点调试呢?

 

 

 

 

如上图所示,在 Stream 代码的这一行打断点,如果你选择 Line ,那么就无法调试,跟踪不到Stream在管道中传输以及在管道的节点上进行的filter处理动作。

选择断点加在 lambda表达式上,然后使用单步调试才可以进入,不得不说 IDEA 是真的强👍🏻。我印象中之前使用2019版本打断点是没有出现这个提示的,反正2020以上的版本肯定都有了,打断点的时候就会提示选择。

虽然可以调试,问题是可以解决了,不过还不够强,接下来大家别眨眼睛,一个更强大、更直观的视图,帮助我们一眼就能看出 Stream 的处理过程。

可视化追踪 Stream 链

步骤还是上面的一样,打断点,以Debug的方式运行程序,区别在于打断点时无需选择是行端点还是lambda表达式上面,随便选择只要打上断点即可:

 

 

 

 

 

点击图中按钮,就会自动打开一个Stream处理流程的视图,整个处理过程变得一目了然,视图分为三分部,左边是初始集合的数据,中间是Stream处理过滤后的数据,右边是最终操作得到的处理结果。

 

 

 

 

这样Java8 Stream 相关的API( 筛选, 排序,聚合)操作就都可以可视化的展示出来了,调试时非常的方便,排查问题岂不是一眼就看到问题所在了。你说这个玩意香不香呢😋? 

责任编辑:庞桂玉 来源: Hollis
相关推荐

2022-09-06 11:53:00

开发计算

2010-01-06 09:54:59

2023-05-12 07:40:01

Java8API工具

2019-09-03 09:30:46

ss 命令SocketLinux

2016-09-25 16:02:09

《硅谷》编程虚拟内存

2021-06-28 20:01:07

电脑性能Windows 7

2020-08-13 09:23:59

浏览器Chrome下载

2012-02-01 15:41:42

2020-09-16 06:08:10

Linux文本比对代码

2021-07-06 07:21:17

桥接模式组合

2019-01-03 08:14:20

路由器系统后台网络

2022-02-06 00:02:43

Windows 11虚拟机微软

2015-10-12 11:02:07

李彦宏创业失败

2020-02-10 10:43:29

网络攻击安全数据

2011-05-03 11:13:51

黑盒

2020-06-22 14:18:02

运维架构技术

2015-10-12 10:17:35

李彦宏百度创业

2019-10-15 16:02:23

戴尔

2023-12-18 08:24:09

LinuxPythonWord

2022-06-21 09:27:01

PythonFlaskREST API
点赞
收藏

51CTO技术栈公众号