Questo è possibile per Iterable.forEach()
(ma non in modo affidabile con Stream.forEach()
). La soluzione non è bella, ma è possibile.
AVVERTENZA : non è necessario utilizzarlo per controllare la logica aziendale, ma esclusivamente per gestire una situazione eccezionale che si verifica durante l'esecuzione di forEach()
. Ad esempio, quando una risorsa smette improvvisamente di essere accessibile, uno degli oggetti elaborati viola un contratto (ad esempio, il contratto afferma che tutti gli elementi nel flusso non devono essere null
ma improvvisamente e inaspettatamente uno di essi è null
) ecc.
Secondo la documentazione per Iterable.forEach()
:
Esegue l'azione specificata per ciascun elemento di Iterable
fino a quando tutti gli elementi non sono stati elaborati o l'azione genera un'eccezione ... Le eccezioni generate dall'azione vengono inoltrate al chiamante.
Quindi si genera un'eccezione che interromperà immediatamente il ciclo interno.
Il codice sarà qualcosa del genere - non posso dire che mi piace ma funziona. Crea la tua classe BreakException
che si estende 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
}
Si noti che il nontry...catch
è attorno all'espressione lambda, ma piuttosto attorno all'intero metodo. Per renderlo più visibile, vedere la seguente trascrizione del codice che lo mostra più chiaramente: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
dichiarazione.