Це є можливим 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це НЕ навколо лямбда - вираження, а навколо весь 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твердження.