Vous pouvez réellement étendre Consumer
(et Function
etc.) avec une nouvelle interface qui gère les exceptions - en utilisant les méthodes par défaut de Java 8 !
Considérez cette interface (étend 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;
}
Ensuite, par exemple, si vous avez une liste:
final List<String> list = Arrays.asList("A", "B", "C");
Si vous voulez le consommer (par exemple avec forEach
) avec du code qui lève des exceptions, vous auriez traditionnellement mis en place un bloc 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);
Mais avec cette nouvelle interface, vous pouvez l'instancier avec une expression lambda et le compilateur ne se plaindra pas:
final ThrowingConsumer<String> throwingConsumer = aps -> {
// maybe some other code here...
throw new Exception("asdas");
};
list.forEach(throwingConsumer);
Ou même simplement le lancer pour être plus succinct!:
list.forEach((ThrowingConsumer<String>) aps -> {
// maybe some other code here...
throw new Exception("asda");
});
Mise à jour : Il semble qu'il y ait une très belle partie de bibliothèque d'utilitaires de Durian appelée Erreurs qui peut être utilisée pour résoudre ce problème avec beaucoup plus de flexibilité. Par exemple, dans mon implémentation ci-dessus, j'ai explicitement défini la politique de gestion des erreurs ( System.out...
ou throw RuntimeException
), tandis que les erreurs de Durian vous permettent d'appliquer une politique à la volée via une large suite de méthodes utilitaires. Merci de le partager , @NedTwigg !.
Exemple d'utilisation:
list.forEach(Errors.rethrow().wrap(c -> somethingThatThrows(c)));