这是可能的Iterable.forEach()
(但使用不能可靠Stream.forEach()
)。解决方案不是很好,但是有可能。
警告:您不应将其用于控制业务逻辑,而应仅用于处理在执行期间发生的异常情况forEach()
。例如资源突然停止访问,处理的对象之一违反了契约(例如,契约说流中的所有元素一定不是,null
但突然而意外地是其中的一个null
),等等。
根据文档Iterable.forEach()
:
对中的每个元素执行给定的操作,Iterable
直到处理完所有元素或该操作引发异常为止。该操作引发的异常将中继到调用方。
因此,您引发了一个异常,该异常将立即中断内部循环。
该代码将是这样的- 我不能说我喜欢它,但是它可以工作。您可以创建自己的BreakException
扩展类RuntimeException
。
try {
someObjects.forEach(obj -> {
// some useful code here
if(some_exceptional_condition_met) {
throw new BreakException();
}
}
}
catch (BreakException e) {
// here you know that your condition has been met at least once
}
请注意,try...catch
是不是周围的lambda表达式,而是围绕整个forEach()
方法。为了使它更加可见,请参见下面的代码转录,它可以更清楚地显示它:
Consumer<? super SomeObject> action = obj -> {
// some useful code here
if(some_exceptional_condition_met) {
throw new BreakException();
}
});
try {
someObjects.forEach(action);
}
catch (BreakException e) {
// here you know that your condition has been met at least once
}
for
陈述即可。