实际上你可以扩展Consumer(和Function(等等)有一个处理异常的新接口-使用Java 8的默认方法!
考虑这个接口(扩展Consumer):@FunctionalInterfacepublic interface ThrowingConsumer extends Consumer {
@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;}
然后,例如,如果您有一个列表:final List list = Arrays.asList("A", "B", "C");
如果你想吃的话。带着forEach)使用一些抛出异常的代码,您通常会设置一个try/catch块:final Consumer 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);
但是使用这个新接口,您可以使用lambda表达式实例化它,编译器不会抱怨:final ThrowingConsumer throwingConsumer = aps -> {
// maybe some other code here...
throw new Exception("asdas");};list.forEach(throwingConsumer);
甚至只是为了更简洁!:list.forEach((ThrowingConsumer) aps -> {
// maybe some other code here...
throw new Exception("asda");});
更新:看起来有一个非常好的实用程序库榴莲叫错误它可以用更多的灵活性来解决这个问题。例如,在上面的实现中,我显式地定义了错误处理策略(System.out...或throw RuntimeException),而Durian的错误允许您通过一组大型实用方法动态地应用策略。谢谢分享它,@NedTwigg!
样本使用情况:list.forEach(Errors.rethrow().wrap(c -> somethingThatThrows(c)));