如何中斷forEach的執行

答案:無解。

可以說forEach就不是一個正經的循環,不是設計來可以被中斷的。

尤其是steam中的forEach,steam這玩意是可以並行運行的,真支持break了,很多不可預料的問題都有可能發生。

1、NG:break和continue

這倆玩意直接編譯報錯。還是說,jvm就沒把forEach當做for來看待。

2、NG:return

不報錯,但是效果只相當於for裏面的continue,無法阻止下一次循環的運行。

3、NG:throw Exception

通過拋異常確實可以中斷forEach,但是利用異常控制代碼流程,絕對不是一個有點職業素養的工程師能幹出來的事。

4、變通方法:利用findFirst或者anyMatch

一個常見的跳出循環的場景,是找到了需要的數據,那麼我們可以利用steam的findFirst()來達到相同的目的,從而規避“中斷forEach”這個需求。

比如這樣寫:

Optional<ValueObject> result = valueObjectList.stream().filter(obj -> your_conditions).findFirst();

或者是判斷是否有元素符合某些條件時:

boolean result = valueObjectList.stream().anyMatch(obj -> your_conditions);

5、變通方法:放棄lambda/steam

有些時候,爲了代碼簡潔或者是steam的高性能,而絞盡腦汁生搬硬造出來一大堆別人看半天不明白是在幹啥的代碼,又是何苦呢。

直接用for它不香嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章