面试官:Java8 lambda 表达式 forEach 如何提前终止?

程序员的成长之路

共 1378字,需浏览 3分钟

 · 2022-07-31

程序员的成长之路
互联网/程序员/技术/资料共享 
关注


阅读本文大概需要 2.8 分钟。
来自:blog.csdn.net/weixin_39597399/article/details/114232746

1.情景展示

如上图所示,我们想要终止for循环,使用return。
执行结果如下:

我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。
也就是说,关键字"return",在这里执行的效果相当于普通for循环里的关键词continue"。

2.原因分析

我们知道,在普通for循环里面,想要提前结束(终止)循环体使用"break";
结束本轮循环,进行下一轮循环使用"continue";
另外,在普通for里,如果使用"return",不仅强制结束for循环体,还会提前结束包含这个循环体的整个方法。
而在Java8中的forEach()中,"break"或"continue"是不被允许使用的,而return的意思也不是原来return代表的含义了。
我们来看看源码:

forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行用什么?当然是return啦;
java8的forEach()和JavaScript的forEach()用法是何其的相似,感兴趣的可以去了解下(在文末)。
Java不是万能的,不要再吐槽它垃圾了。

3.解决方案

方案一:使用原始的foreach循环

使用过eclipse的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/,就会出现foreach的代码提示。
如上图所示,这种格式的for循环才是真正意义上的foreach循环。
在idea中输入,按照上述操作是不会有任何代码提示的,那如何才能在idea中,调出来呢?

for循环可以提前终止。
方式一:break

方式二:return(不推荐使用)

方案二:抛出异常

我们知道,要想结束一个方法的执行,正常的逻辑是:使用return;
但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止forEach()方法的目的。

如果觉得这种方式不友好,可以再包装一层。

这样,就完美了。
这里,需要注意的一点是:要确保你forEach()方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;
否则,当真正该因异常导致代码终止的时候,因为咱们手动捕获了并且没做任何处理,岂不是搬起石头砸自己的脚吗?
<END>

推荐阅读:

Spring Event,贼好用的业务解耦神器!

JWT 实现登录认证 + Token 自动续期方案,这才是正确的使用姿势!

互联网初中高级大厂面试题(9个G)

内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!

戳阅读原文领取!                                  朕已阅 

浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报