Це є можливим 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
твердження.