抛出异常的Java 8 Lambda函数?

抛出异常的Java 8 Lambda函数?

我知道如何创建对具有String参数并返回int它是:

Function<String, Integer>

但是,如果函数抛出异常,则此操作不起作用,例如,它被定义为:

Integer myMethod(String s) throws IOException

我将如何定义这个引用?


一只萌萌小番薯
浏览 1302回答 3
3回答

慕后森

您需要执行以下操作之一。如果是您的代码,那么定义您自己的函数接口来声明选中的异常:@FunctionalInterfacepublic&nbsp;interface&nbsp;CheckedFunction<T,&nbsp;R>&nbsp;{ &nbsp;&nbsp;&nbsp;R&nbsp;apply(T&nbsp;t)&nbsp;throws&nbsp;IOException;}并使用它:void&nbsp;foo&nbsp;(CheckedFunction&nbsp;f)&nbsp;{&nbsp;...&nbsp;}否则,包装Integer myMethod(String s)在不声明选中异常的方法中:public&nbsp;Integer&nbsp;myWrappedMethod(String&nbsp;s)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;myMethod(s); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;catch(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;UncheckedIOException(e); &nbsp;&nbsp;&nbsp;&nbsp;}}然后:Function<String,&nbsp;Integer>&nbsp;f&nbsp;=&nbsp;(String&nbsp;t)&nbsp;->&nbsp;myWrappedMethod(t);或:Function<String,&nbsp;Integer>&nbsp;f&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;(String&nbsp;t)&nbsp;->&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;myMethod(t); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;UncheckedIOException(e); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;};

慕的地10843

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

相关分类

Java