【345期】Java8 Lambda 表达式中 forEach 如何提前终止?

1.情景展示

dedcb79c479a26bbcac90f1c00f55264.png

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

执行结果如下:

0e8fe3f5db0c8340a9bfc757161d9050.png

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

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

2.原因分析

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

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

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

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

我们来看看源码:

28d8f680b36cde05c804e80ba7d07b2d.png

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

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

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

3.解决方案

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

fbf1c17dfb2bae3a4a3a1c97a5ec1664.png

使用过eclipse的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/,就会出现foreach的代码提示。另外,更多java面试题,公众号Java精选,回复java面试,获取面试资料。

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

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

d07ed087b01381f4194050ad6753fd51.png

for循环可以提前终止。

方式一:break

7bcca5a627ec508b9c7a6d76eb3af9ed.png

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

534d1b573b757ca2f55c827d02cee4b6.png

方案三:抛出异常

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

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

fb84fab0c62349affb20739575b8a081.png

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

9571f172cccc17fe5364f1cdab6da4b6.png

这样,就完美了。

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

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

写在最后

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

作者:weixin_39597399

https://blog.csdn.net/litianxiang_kaola

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

------ 特别推荐 ------

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,在看,转发吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值