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 nur zur Behandlung einer Ausnahmesituation, die während der Ausführung der forEach()
. Wenn eine Ressource plötzlich nicht mehr zugänglich ist, verstößt eines der verarbeiteten Objekte gegen einen Vertrag (z. B. besagt der Vertrag, dass nicht alle Elemente im Stream vorhanden sein dürfen, null
sondern plötzlich und unerwartet eines davonnull
) usw.
Gemäß der Dokumentation für Iterable.forEach()
:
Führt die angegebene Aktion für jedes Element von aus, Iterable
bis alle Elemente verarbeitet wurden oder die Aktion eine Ausnahme auslöst ... Von der Aktion ausgelöste Ausnahmen werden an den Aufrufer weitergeleitet.
Sie lösen also eine Ausnahme aus, die die interne Schleife sofort unterbricht.
Der Code wird ungefähr so sein - ich kann nicht sagen, dass er mir gefällt, aber er funktioniert. Sie erstellen Ihre eigene Klasse, BreakException
die erweitert wird 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
}
Beachten Sie, dass try...catch
es sich nicht um den Lambda-Ausdruck handelt, sondern um die gesamte forEach()
Methode. Um es besser sichtbar zu machen, lesen Sie die folgende Transkription des Codes, die es deutlicher zeigt:
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
Aussage.