Dies ist möglich für Iterable.forEach()
(aber nicht zuverlässig mit Stream.forEach()
). Die Lösung ist nicht schön, aber es ist möglich.
WARNUNG: Sie sollten es nicht zur Steuerung der Geschäftslogik verwenden, sondern rein für den Umgang mit einer Ausnahmesituation, die während der Ausführung des forEach()
auftritt. Zum Beispiel wenn plötzlich ein Ressource nicht mehr erreichbar ist, eines der verarbeiteten Objekte einen Vertrag verletzt (z.B. der Vertrag besagt, dass alle Elemente im Stream nicht null
sein dürfen, aber plötzlich und unerwartet ist eines davon null
) usw.
Laut der Dokumentation für Iterable.forEach()
:
Führt die gegebene Aktion für jedes Element des Iterable
aus, bis alle Elemente verarbeitet wurden oder die Aktion eine Ausnahme auslöst... Ausnahmen, die von der Aktion ausgelöst werden, werden an den Aufrufer weitergeleitet.
Sie werfen also eine Ausnahme, die sofort die interne Schleife abbricht.
Der Code wird etwas wie folgt sein - Ich kann nicht sagen, dass ich es mag, aber es funktioniert. Sie erstellen Ihre eigene Klasse BreakException
, die RuntimeException
erweitert.
try {
someObjects.forEach(obj -> {
// hier steht nützlicher Code
if(eine_ausnahmsbedingung_erfüllt) {
throw new BreakException();
}
}
}
catch (BreakException e) {
// hier wissen Sie, dass Ihre Bedingung mindestens einmal erfüllt wurde
}
Beachten Sie, dass das try...catch
nicht um den Lambda-Ausdruck herum steht, sondern vielmehr um die gesamte forEach()
-Methode. Um es deutlicher zu machen, sehen Sie sich die folgende Transkription des Codes an, die es klarer zeigt:
Consumer action = obj -> {
// hier steht nützlicher Code
if(eine_ausnahmsbedingung_erfüllt) {
throw new BreakException();
}
});
try {
someObjects.forEach(action);
}
catch (BreakException e) {
// hier wissen Sie, dass Ihre Bedingung mindestens einmal erfüllt wurde
}