答案:無解。
可以說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它不香嗎?