Puoi effettivamente estendere Consumer
(ed Function
ecc.) Con una nuova interfaccia che gestisce le eccezioni, usando i metodi predefiniti di Java 8 !
Considera questa interfaccia (estesa Consumer
):
@FunctionalInterface
public interface ThrowingConsumer<T> extends Consumer<T> {
@Override
default void accept(final T elem) {
try {
acceptThrows(elem);
} catch (final Exception e) {
// Implement your own exception handling logic here..
// For example:
System.out.println("handling an exception...");
// Or ...
throw new RuntimeException(e);
}
}
void acceptThrows(T elem) throws Exception;
}
Quindi, ad esempio, se hai un elenco:
final List<String> list = Arrays.asList("A", "B", "C");
Se vuoi consumarlo (ad es. Con forEach
) con un codice che genera eccezioni, tradizionalmente avresti impostato un blocco try / catch:
final Consumer<String> consumer = aps -> {
try {
// maybe some other code here...
throw new Exception("asdas");
} catch (final Exception ex) {
System.out.println("handling an exception...");
}
};
list.forEach(consumer);
Ma con questa nuova interfaccia, puoi istanziarla con un'espressione lambda e il compilatore non si lamenterà:
final ThrowingConsumer<String> throwingConsumer = aps -> {
// maybe some other code here...
throw new Exception("asdas");
};
list.forEach(throwingConsumer);
O anche solo lanciarlo per essere più conciso !:
list.forEach((ThrowingConsumer<String>) aps -> {
// maybe some other code here...
throw new Exception("asda");
});
Aggiornamento : sembra che ci sia una parte molto bella della libreria di utilità di Durian chiamata Errori che può essere usata per risolvere questo problema con molta più flessibilità. Ad esempio, nella mia implementazione sopra ho definito esplicitamente la politica di gestione degli errori ( System.out...
o throw RuntimeException
), mentre gli errori di Durian ti consentono di applicare una politica al volo tramite una vasta suite di metodi di utilità. Grazie per averlo condiviso , @NedTwigg !.
Esempio di utilizzo:
list.forEach(Errors.rethrow().wrap(c -> somethingThatThrows(c)));