当在Iterable上使用外部迭代时,我们使用break或return from enhanced for-each循环,如下:
for (SomeObject obj : someObjects) {
if (some_condition_met) {
break; // or return obj
}
}
如何在Java 8 lambda表达式中使用内部迭代中断或返回:
someObjects.forEach(obj -> {
//what to do here?
})
这对于Iterable.forEach()是可能的(但对于Stream.forEach()不可靠)。这个解决方案并不好,但它是可能的。
警告:您不应该使用它来控制业务逻辑,而应该纯粹用于处理forEach()执行期间发生的异常情况。例如,某个资源突然停止可访问,某个被处理的对象违反了契约(例如,契约规定流中的所有元素都不能为空,但突然且意外地有一个元素为空)等等。
根据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
}
这对于Iterable.forEach()是可能的(但对于Stream.forEach()不可靠)。这个解决方案并不好,但它是可能的。
警告:您不应该使用它来控制业务逻辑,而应该纯粹用于处理forEach()执行期间发生的异常情况。例如,某个资源突然停止可访问,某个被处理的对象违反了契约(例如,契约规定流中的所有元素都不能为空,但突然且意外地有一个元素为空)等等。
根据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
}