Java8 Lambda 表達(dá)式中的 forEach 如何提前終止?
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

1.情景展示

如上圖所示,我們想要終止for循環(huán),使用return。
執(zhí)行結(jié)果如下:

我們可以看到,只有趙六沒被打印出來,后續(xù)的數(shù)組元素依舊被執(zhí)行了。
也就是說,關(guān)鍵字"return",在這里執(zhí)行的效果相當(dāng)于普通for循環(huán)里的關(guān)鍵詞continue"。
2.原因分析
我們知道,在普通for循環(huán)里面,想要提前結(jié)束(終止)循環(huán)體使用"break";
結(jié)束本輪循環(huán),進(jìn)行下一輪循環(huán)使用"continue";
另外,在普通for里,如果使用"return",不僅強(qiáng)制結(jié)束for循環(huán)體,還會(huì)提前結(jié)束包含這個(gè)循環(huán)體的整個(gè)方法。
而在Java8中的forEach()中,"break"或"continue"是不被允許使用的,而return的意思也不是原來return代表的含義了。
我們來看看源碼:

forEach(),說到底是一個(gè)方法,而不是循環(huán)體,結(jié)束一個(gè)方法的執(zhí)行用什么?當(dāng)然是return啦;
java8的forEach()和JavaScript的forEach()用法是何其的相似,感興趣的可以去了解下(在文末)。
Java不是萬能的,不要再吐槽它垃圾了。
3.解決方案
方案一:使用原始的foreach循環(huán)

使用過eclipse的老鐵們應(yīng)該知道,當(dāng)我們輸入:foreach,再按快捷鍵:Alt+/,就會(huì)出現(xiàn)foreach的代碼提示。
如上圖所示,這種格式的for循環(huán)才是真正意義上的foreach循環(huán)。
在idea中輸入,按照上述操作是不會(huì)有任何代碼提示的,那如何才能在idea中,調(diào)出來呢?

for循環(huán)可以提前終止。
方式一:break

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

方案三:拋出異常
我們知道,要想結(jié)束一個(gè)方法的執(zhí)行,正常的邏輯是:使用return;
但是,在實(shí)際運(yùn)行中,往往有很多不突發(fā)情況導(dǎo)致代碼提前終止,比如:空指針異常,其實(shí),我們也可以通過拋出假異常的方式來達(dá)到終止forEach()方法的目的。

如果覺得這種方式不友好,可以再包裝一層。

這樣,就完美了。
這里,需要注意的一點(diǎn)是:要確保你forEach()方法體內(nèi)不能有其它代碼可能會(huì)拋出的異常與自己手動(dòng)拋出并捕獲的異常一樣;
否則,當(dāng)真正該因異常導(dǎo)致代碼終止的時(shí)候,因?yàn)樵蹅兪謩?dòng)捕獲了并且沒做任何處理,豈不是搬起石頭砸自己的腳嗎?
寫在最后
哪位大佬如若發(fā)現(xiàn)文章存在紕漏之處或需要補(bǔ)充更多內(nèi)容,歡迎留言?。?!
來源:https://blog.csdn.net/weixin_39597399
????
往 期 推 薦
1、拖動(dòng)文件就能觸發(fā)7-Zip安全漏洞,波及所有版本
3、一次 SQL 查詢優(yōu)化原理分析:900W+ 數(shù)據(jù),從 17s 到 300ms
4、Redis數(shù)據(jù)結(jié)構(gòu)為什么既省內(nèi)存又高效?
點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看





