Java8 lambda 表达式 forEach 如何提前终止?
情景展示
•原因分析
•解决方案
如上图所示,我们想要终止 for 循环,使用 return。
执行结果如下:
我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。
也就是说,关键字return
,在这里执行的效果相当于普通 for 循环里的关键词continue
。
原因分析
我们知道,在普通 for 循环里面,想要提前结束(终止)循环体使用break
。
结束本轮循环,进行下一轮循环使用continue
。
另外,在普通 for 里,如果使用return
,不仅强制结束 for 循环体,还会提前结束包含这个循环体的整个方法。
而在 Java8 中的 forEach() 中 break
或continue
是不被允许使用的,而return
的意思也不是原来 return 代表的含义了。
我们来看看源码:
forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行用什么?当然是return
啦。
java8 的 forEach()和 JavaScript 的 forEach() 用法是何其的相似。
Java 不是万能的,不要再吐槽它垃圾了。
解决方案
方案一:使用原始的 foreach 循环
使用过 eclipse 的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/
,就会出现 foreach 的代码提示。
如上图所示,这种格式的 for 循环才是真正意义上的 foreach 循环。
在 idea 中输入,按照上述操作是不会有任何代码提示的,那如何才能在 idea 中,调出来呢?
for 循环可以提前终止。
方式一:break
方式二:return (不推荐使用)
方案二:抛出异常
我们知道,要想结束一个方法的执行,正常的逻辑是:使用 return
。
但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止 forEach() 方法的目的。
如果觉得这种方式不友好,可以再包装一层。
这样,就完美了。
这里,需要注意的一点是:要确保你 forEach() 方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;
否则,当真正该因异常导致代码终止的时候,因为咱们手动捕获了并且没做任何处理,岂不是搬起石头砸自己的脚吗?