Lambda 表达式中的 forEach停止循环

发布时间:2024-02-09 17:00

一:情景展示:

\"Lambda
如上图所示,我们想要终止for循环,使用return。
执行结果如下:
\"在这里插入图片描述\"
我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。也就是说,关键字\"return\",在这里执行的效果相当于普通for循环里的关键词continue\"。

二:原因分析

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

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

三:解决方案

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

return 可以提前停止循环和方法
\"Lambda
\"Lambda

break可以提前停止循环
\"Lambda

方案二:抛出异常

我们知道,要想结束一个方法的执行,正常的逻辑是:使用return。但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止forEach()方法的目的。
\"Lambda
如果觉得这种方式不友好,可以再包装一层。
\"Lambda
这样,就完美了。

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

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号