美文网首页
Java8学习笔记之调试Lambda表达式

Java8学习笔记之调试Lambda表达式

作者: 夏与清风 | 来源:发表于2019-07-26 17:01 被阅读0次

调试有问题的代码有两种方式:查看栈跟踪和输出日志。

1、查看栈跟踪

当程序突然停止运行或抛出异常时,首先要检查程序在何处发生了异常以及原因。程序的每次方法调用都会产生相应的调用信息,包括程序中方法调用的位置、该方法调用使用的参数、被调用方法的本地变量等,这些信息被保存在栈帧上。程序失败时,你会得到它的栈跟踪,通过一个又一个栈帧,得到程序失败时的方法调用列表,进而发现问题出现的原因。

不幸的是,由于Lambda表达式没有名字,它的栈跟踪可能很难分析。如下:

运行这段代码会产生下面的栈跟踪:

栈跟踪中包含下面这样类似加密的内容:lambda$main$0。这些表示错误发生在Lambda表达式内部,由于Lambda表达式没有名字,所以编译器只能为它们指定一个名字。如果使用了大量的类,其中又包含多个Lambda表达式,排查问题将会非常困难。

即使使用了方法引用,还是有可能出现栈无法显示使用的方法名的情况。比如将Lambda表达式p-> p.getX()替换为方法引用reference Point::getX也会产生难于分析的栈跟踪:

如果方法引用指向的是同一个类中声明的方法,那么它的名称是可以在栈跟踪中显示的。如下:

2、使用日志调试

对流操作中的流水线进行调试,示例如下:

运行结果

不幸的是,一旦调用forEach,整个流就会恢复运行,如何更有效的控制流水线中每个操作产生的输出(如map、filter、limit)?

解决方式是使用流操作方法peek。peek的设计初衷就是在流的每个元素恢复运行前,插入执行一个动作。但它不像forEach那样恢复整个流的运行,而是在一个元素上完成操作之后,它只会将操作顺承到流水线中的下一个操作。

运行结果 peek的操作流程

--参考文献《Java8实战》

相关文章

网友评论

      本文标题:Java8学习笔记之调试Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/vgrdrctx.html