Você pode realmente estender Consumer
(e Function
etc.) com uma nova interface que lida com exceções - usando os métodos padrão do Java 8 !
Considere esta interface (estende 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;
}
Então, por exemplo, se você tiver uma lista:
final List<String> list = Arrays.asList("A", "B", "C");
Se você quiser consumi-lo (por exemplo, com forEach
) com algum código que gera exceções, tradicionalmente você configuraria um bloco 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);
Mas com essa nova interface, você pode instancia-la com uma expressão lambda e o compilador não irá reclamar:
final ThrowingConsumer<String> throwingConsumer = aps -> {
// maybe some other code here...
throw new Exception("asdas");
};
list.forEach(throwingConsumer);
Ou até mesmo faça o elenco para ser mais sucinto !:
list.forEach((ThrowingConsumer<String>) aps -> {
// maybe some other code here...
throw new Exception("asda");
});
Atualização : Parece que há uma parte muito agradável da biblioteca de utilitários do Durian chamada Erros, que pode ser usada para resolver esse problema com muito mais flexibilidade. Por exemplo, na minha implementação acima, defini explicitamente a política de tratamento de erros ( System.out...
ou throw RuntimeException
), enquanto os erros do Durian permitem aplicar uma política em tempo real por meio de um amplo conjunto de métodos utilitários. Obrigado por compartilhar , @NedTwigg !.
Uso da amostra:
list.forEach(Errors.rethrow().wrap(c -> somethingThatThrows(c)));