java8 foreach 异常_Java8 lambda表达式forEach不能提前终止循环的两种解决方案

文章讨论了在Java8的forEach循环中,return关键字并不像传统for循环中那样终止整个方法,而是相当于continue。由于forEach不支持break或continue,提出了两种解决方案:使用传统的for循环配合break,或者通过抛出异常来中断执行。在抛出异常时,需注意避免与已有异常冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.情景展示

afb0880442e00b162f528bf953ba35f9.png

如上图所示,我们想要终止for循环,使用return。

执行结果如下:

9c544df0e0fdaa58650bce67d89a58a1.png

我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。

也就是说,关键字"return",在这里执行的效果相当于普通for循环里的关键词continue"。

2.原因分析

我们知道,在普通for循环里面,想要提前结束(终止)循环体使用"break";

结束本轮循环,进行下一轮循环使用"continue";

另外,在普通for里,如果使用"return",不仅强制结束for循环体,还会提前结束包含这个循环体的整个方法。

而在Java8中的forEach()中,"break"或"continue"是不被允许使用的,而return的意思也不是原来return代表的含义了。

我们来看看源码:

7fc0bc83dcb545945b0051c2e163e455.png

forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行用什么? 当然是return啦;

java8的forEach()和JavaScript的forEach()用法是何其的相似,感兴趣的可以去了解下(在文末)。

Java不是万能的,不要再吐槽它垃圾了。

3.解决方案

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

392ef1b0ce46843f7ed1659980d612ea.png

使用过eclipse的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/,就会出现foreach的代码提示。

如上图所示,这种格式的for循环才是真正意义上的foreach循环。

在idea中输入,按照上述操作是不会有任何代码提示的,那如何才能在idea中,调出来呢?

244d58f831e7c591aa8d7b428a1efeda.png

for循环可以提前终止。

方式一:break

a6bd8ed878a103e223c28931ff3da21e.png

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

8e51019a028e758726e19e3eb6a151a7.png

方案二:抛出异常

我们知道,要想结束一个方法的执行,正常的逻辑是:使用return;

但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止forEach()方法的目的。

4035aea93363b1e88cb985b49465e308.png

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

35a5ec7eda334b2de216f23df5e7089e.png

这样,就完美了。

这里,需要注意的一点是:要确保你forEach()方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;

否则,当真正该因异常导致代码终止的时候,因为咱们手动捕获了并且没做任何处理,岂不是搬起石头砸自己的脚吗?

写在最后

哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

相关推荐:

来源:https://blog.youkuaiyun.com/weixin_39597399/article/details/114232746
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值