包装Lambda表达式以供Runnable处理异常

时间:2018-08-22 12:22:51

标签: java lambda java-8

我正在尝试初始化Runnable的数组,然后运行其代码。我需要初始化尽可能地易读,因此我为此使用了Lambda表达式。现在,我不知道如何解决异常问题。如果Runnables内部的某些代码引发了已检查的异常,我想将其自动包装到RuntimeException中,而不要将try / catch逻辑放入每个Runnable主体中。

代码如下:

public void addRunnable(Runnable ... x); // adds a number of Runnables into an array
...
addRunnable(
   ()->{
       some code;
       callMethodThrowsException();  // this throws e.g. IOException
   },

   ()->{
       other code;
   }
   // ... and possibly more Runnables here
);

public void RunnableCaller(List<Runnable> runnables) {
    // Now I want to execute the Runnables added to the array above
    // The array gets passed as the input argument "runnables" here
    for(Runnable x: runnables) {
        try {
            x.run();
        } catch(Exception e) { do some exception handling }
    }
}

该代码无法编译,因为callMethodThrowsException引发了一个已检查的异常,而Runnable则没有,因此我必须插入Runnable定义的try / catch块INSIDE。 try / catch块会使事情变得不那么方便了,因为我将不得不将其放入每个Runnable主体声明中,这将很难阅读且难以编写。另外,我可以创建自己的引发异常的Runnable类,但随后我不能使用Lambda表达式()->来使其简短易读,而不是

new ThrowingRunnable() { public void run() throws Exception { some code; } }

有没有一种方法来定义自己的功能接口来解决此问题,因此我可以使用相同的代码,但是异常将被包装到例如RuntimeExceptions左右?我对调用代码有完全的控制权,因此捕获那里的异常是没有问题的,我只需要一种可读性强的编写代码的方式,以后即可执行。

我看到了这个主题Java 8 Lambda function that throws exception?,但是我并没有弄清楚如何解决我的问题,我对功能接口不是很熟悉。可能有人可以帮忙,谢谢。

1 个答案:

答案 0 :(得分:1)

Lambda不仅适用于JVM提供的接口。它们可用于精确定义一个且只有一个抽象方法的每个接口。这样您就可以自己创建一个接口,您已经对其进行了命名:

public interface ThrowingRunnable{
    void run() throws Exception;
}

然后在addRunnable方法中替换参数类型:

public void addRunnable(ThrowingRunnable... runnables){ ... }

然后让它进行编译:

addRunnable(
   ()->{
       some code;
       callMethodThrowsException();  // this throws e.g. IOException
   },

   ()->{
       other code;
   }
   // ... and possibly more Runnables here
);