IntelliJ IDEA 调试 Java 8 Stream,实在太香了!
前段时间,栈长发布了一篇关于 Java 8 Optional.map 的实用文章,留言区就有的人说 Java 8 的语法糖不方便调试,还要视情况使用。

留言区也有人说 IntelliJ IDEA 早已支持 Java 8 Stream 调试,因为我平时也很少调试,那么我就以 IntelliJ IDEA 来演示下如何调试 Java 8 中的 Stream 链式调用吧。
先写一段 Java 8 Stream 示例:
/*
* 来源公众号:Java技术栈
*/
public static void main(String[] args) {
Stream.of(100, 200, 300, 400, 500)
.mapToLong(e -> e * 10)
.filter(e -> e > 2000)
.forEach(System.out::println);
}
这里只演示了一种 Stream 创建方式,Java 8 创建 Stream 的 10 种方式请点击这里进行阅读。
这个程序是先构建一个 5 个数字的 Stream, 然后再对每个数字 * 10,再筛选出大于 2000 的数字进行打印。
如何调试每个链式调用的过程呢?
先在第一行打个断点,然后进入调试模式运行,当断点进入时,点击调试窗口的 Trace Current Stream Chain 按钮:

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



也可以点击左下角的 Flat Mode 进入扁平模式,一次性展示所有跟踪结果:

OK,Java 8 Stream 的调试不是问题了, 但我并没有找到像 Optional 链式调用的调试方式。
比如下面一段 Optional 示例:
/*
* 来源公众号:Java技术栈
*/
public static void main(String[] args) {
String string = Optional.of("hi,")
.map(e -> e + "Java")
.map(e -> e + "技术")
.map(e -> e + "栈").get();
System.out.println(string);
}
调试如图所示:

可惜,Trace Current Stream Chain 按钮是灰色状态,不能进入,因为那个按钮只能被 Stream 调试所用。
那像这种非 Stream 链式调用怎么调试呢?
断点进入后,可以选中需要调试的部分链式代码片断,然后右键选中 Evaluate Expression 菜单(ALT + F8)进入表达式计算窗口:


点击 Evaluate 按钮开始计算:

计算无误,该表达式还可以自由编辑,非常强大。
虽然没有像 Stream 这样专属的调试面板,使用 Evaluate Expression 也能达到调试链式调用的目的吧。关于这个,你还有其他调试方案么?欢迎留言分享!
好了,本次的分享就到这里了,希望对大家有用。觉得不错,在看、转发分享一下哦~
关注Java技术栈微信公众号,栈长将继续分享好玩的 Java 技术,公众号第一时间推送,在公众号后台回复:IDEA,可以获取历史 IDEA 教程,都是干货。
近期热文推荐:
1.Java 15 正式发布, 14 个新特性,刷新你的认知!!
2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!
3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。
觉得不错,别忘了随手点赞+转发哦!
IntelliJ IDEA 调试 Java 8 Stream,实在太香了!的更多相关文章
- Intellij Idea调试java文件时 怎么跳过class文件?
Intellij Idea调试时 java文件时,遇到class文件时它也会反编译该文件,并跳入该class文件内一条条语句执行.这让我烦透了,怎么跳过class文件,继续调试啊? SETTINGS- ...
- IntelliJ IDEA中如何优雅的调试Java Stream操作
Stream操作是Java 8推出的一大亮点!虽然java.util.stream很强大,但依然还是有很多开发者在实际工作中很少使用,其中吐槽最多的一个原因就是不好调试,一开始确实是这样,因为stre ...
- 用GDB 调试Java程序
陈皓 http://blog.csdn.net/haoel 背景 想要使用GDB调试程序,就需要用GNU的编译器编译程序.如:用GCC编译的C/C++的程序,才能用GDB调试.对于Java程序也是 ...
- IntelliJ远程调试教程
概述 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解了解Java远程调试这个牛逼的 ...
- [零]java8 函数式编程入门官方文档中文版 java.util.stream 中文版 流处理的相关概念
前言 本文为java.util.stream 包文档的译文 极其个别部分可能为了更好理解,陈述略有改动,与原文几乎一致 原文可参考在线API文档 https://docs.oracle.com/jav ...
- java.util.stream 库简介
Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表 ...
- Java 8 Stream 教程
Java 8 Stream Tutorial 本文采用实例驱动的方式,对JAVA8的stream API进行一个深入的介绍.虽然JAVA8中的stream API与JAVA I/O中的InputStr ...
- Idea IntelliJ远程调试教程
总结 第一步:修改startup.sh 在倒第二行加上export JPDA_ADDRESS=8787 最后一行在start前面加上" jpda " 第二步:配置Idea, ...
- 源码编译OpenJdk 8,Netbeans调试Java原子类在JVM中的实现(Ubuntu 16.04)
一.前言 前一阵子比较好奇,想看到底层(虚拟机.汇编)怎么实现的java 并发那块. volatile是在汇编里加了lock前缀,因为volatile可以通过查看JIT编译器的汇编代码来看. 但是原子 ...
随机推荐
- Unity资源引用问题
前几天做项目时,遇到一个奇怪的问题: 从一处复制了一个预制体,预制体上面还附有一个材质球,材质球上关联着另一张贴图. 将所有关联的东西,均Copy两份,然后关联成一个新的预制体,最后用项目内的读取内存 ...
- P1020 导弹拦截(nlogn求最长不下降子序列)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- 跟着兄弟连系统学习Linux-【day08】
day08-20200605 p27.软件包管理简 windows 和 linux 软件是不同的版本. Linux源码包,开源的.绝大部分都是C语言写的.源码包安装速度比较慢.需要先编译后再安装.脚本 ...
- 利用ANSI转义序列在控制台输出彩色文字
说明:无论什么语言,只要你的终端能够解释ANSI转义序列(大多数的类unix终端仿真器都能够解释ANSI转义序列,win32控制台则不支持),就能够使用ANSI转义序列输出颜色.这个功能看似鸡肋,但只 ...
- nginx模型概念和配置文件结构
一. nginx模型概念: Nginx会按需同时运行多个进程: 一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程( ...
- flag在index里
题目:http://123.206.87.240:8005/post/ 我们来看这一题 首先打开题目 他让点击就点击呗 跳转到另一个新的界面 这就没了??? ... 没思路就对了 //假装证明自 ...
- leetcode刷题-83删除排序链表中的重复元素
题目 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 实现 # Definition for singly-li ...
- MySql 实现数组根据下标获取对应值逻辑(array[i]逻辑)
在使用sql模拟一段java逻辑开发时碰到有一段逻辑为从字符串数组中根据下标获取对应的值的情况,百度了一番没有发现有类似功能的函数和现成的实现方式,经过调试弄出来了,记录下来,以备参考 //举例:从数 ...
- 干货:不同场景容器内获取客户端源IP的方法
摘要:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢? k8s已经成为当今容器化的标准,人们在享受容器带来的高效与便利的同时,也遇到一些烦恼:客户端和容 ...
- PHP开发规范1.3.3
PHP 开发规范1.3.3 一.编程规约 (一) 命名风格 [强制]代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式. 说明: 正确的英文拼写和语法可以让阅读者易于理解,避免歧义. ...