java - 为 Runnable 包装 Lambda 表达式以处理异常

标签 java lambda java-8

我正在尝试初始化一个 Runnable 数组,然后运行它们的代码。我需要初始化尽可能可读,因此我为此使用了 Lambda 表达式。现在我不知道如何解决异常问题。如果 Runnable 中的某些代码抛出已检查的异常,我想将其自动包装到 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 block 。 try/catch block 会使这件事变得不那么方便,因为我必须将它放入每个 Runnable 主体声明中,这将难以阅读且难以编写。我也可以创建自己的可抛出异常的 Runnable 类,但是我不能使用 Lambda 表达式 ()-> 这使得它简短易读而不是做

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

有没有办法定义我自己的功能接口(interface)来解决这个问题,这样我就可以使用相同的代码,但异常将被包装到例如RuntimeExceptions 还是什么?我可以完全控制调用代码,因此捕获那里的异常没有问题,我只需要一种非常可读的方式来编写稍后将执行的代码。

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

最佳答案

Lambda 不仅适用于 JVM 提供的接口(interface)。它们可用于精确定义一个且仅一个抽象方法的每个接口(interface)。所以你可以自己创建一个接口(interface),你已经命名了它:

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
);

关于java - 为 Runnable 包装 Lambda 表达式以处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51966828/

相关文章:

java - MySQL "select distinct"性能

java - 一般在 SWING/Java 中使用线程的最佳实践

java - Tomcat 8.5 org.apache.juli maxDays 属性不工作

Haskell - 这个素性测试中的 lambda 是什么意思以及它是如何工作的?

Java8流操作被缓存?

java - 获取原始类型的默认值

c++ - 返回带有移动捕获的 lambda 函数

C# 使用索引、对象和 DoStuff()/to 数组列出 Lambda

java - 有什么办法可以简化这个流表达式吗?

java - 使用 Java 8 在一行中构建一组 Node.Leaf.Id