将异常移到Function / lambda之外

时间:2018-11-05 20:18:24

标签: java exception lambda java-8 try-catch

我知道如何处理功能接口中的异常,但是我必须将异常移到我的lambda之外。 (主要应抛出IOExc)

public static void main(String[] args) throws IOException {
    Function<String,List<String>> flines = f->{
//reading from input stream, but i cant use try catch
    }
}

我的新接口必须继承自java.util.function。有什么想法怎么做? 这样的东西效果不佳

 public interface MyFunction<T,R> extends Function<T,R> {


@Override
default R apply(T t) {
    try {
    return applyThrows(t);
    }catch (Exception e){
        throw new RuntimeException(e);
    }
}

R applyThrows (T t) throws IOException;

2 个答案:

答案 0 :(得分:1)

可以使用jOOλ及其Sneaky.functionCheckedFunction来完成,如下所示:

void sample() throws IOException {
    Function<String, List<String>> flines = Sneaky.function(this::applyThrows);
    flines.apply("");
}

List<String> applyThrows(String str) throws IOException {
    throw new IOException();
}

通过Sneaky类,您可以“偷偷摸摸”地抛出原始已检查异常。

如果您不想依赖外部库,则可以复制CheckedException接口并根据Sneaky.function和{{1}的代码编写自己的Unchecked.function }。

答案 1 :(得分:1)

这里有两个方面:

  • 正如JB所评论的那样,当您真的必须取回一个检查的异常时,您的lambda可以将其包装到运行时异常中,而外部代码可以捕获该异常并将其解封装并重新抛出。
  • 但是那么,仅仅因为可以就将语言强加到结构中并不是一个好主意。如果核心设计要点是处理IO,因此您需要处理IOExceptions,那么正确的方法就是不要在这里使用lambda!