Sie können tatsächlich Consumer
(und Function
usw.) mit einer neuen Schnittstelle erweitern, die Ausnahmen behandelt - unter Verwendung von Java 8's Default-Methoden!
Betrachten Sie diese Schnittstelle (erweitert Consumer
):
@FunctionalInterface
public interface ThrowingConsumer extends Consumer {
@Override
default void accept(final T elem) {
try {
acceptThrows(elem);
} catch (final Exception e) {
// Implementieren Sie hier Ihre eigene Ausnahmeverarbeitungslogik..
// Zum Beispiel:
System.out.println("eine Ausnahme behandeln...");
// Oder ...
throw new RuntimeException(e);
}
}
void acceptThrows(T elem) throws Exception;
}
Dann, zum Beispiel, wenn Sie eine Liste haben:
final List liste = Arrays.asList("A", "B", "C");
Wenn Sie sie konsumieren möchten (z.B. mit forEach
) mit etwas Code, der Ausnahmen wirft, hätten Sie traditionell einen try/catch-Block eingerichtet:
final Consumer verbraucher = aps -> {
try {
// vielleicht hier noch etwas anderer Code...
throw new Exception("asdas");
} catch (final Exception ex) {
System.out.println("eine Ausnahme behandeln...");
}
};
list.forEach(verbraucher);
Aber mit dieser neuen Schnittstelle können Sie sie mit einem Lambda-Ausdruck instanziieren und der Compiler wird nicht klagen:
final ThrowingConsumer werfer = aps -> {
// vielleicht hier noch etwas anderer Code...
throw new Exception("asdas");
};
liste.forEach(werfer);
Oder einfach nur es zu konvertieren, um prägnanter zu sein!:
liste.forEach((ThrowingConsumer) aps -> {
// vielleicht hier noch etwas anderer Code...
throw new Exception("asda");
});
Update
Sieht so aus, als gäbe es eine sehr schöne Hilfsbibliothek namens Durian mit einem Teil namens Fehler, die verwendet werden kann, um dieses Problem mit wesentlich mehr Flexibilität zu lösen. Zum Beispiel habe ich in meiner obigen Implementierung die Fehlerbehandlungsrichtlinie explizit definiert (System.out...
oder throw RuntimeException
), während Durians Errors Ihnen ermöglichen, eine Richtlinie über eine große Auswahl an Hilfsmethoden anzuwenden. Vielen Dank fürs Teilen, @NedTwigg!.
Beispielhafte Verwendung:
liste.forEach(Errors.rethrow().wrap(c -> etwasWasAusnahmenWirft(c)));