gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:46:51 25 4
gpt4 key购买 nike

我正在尝试初始化一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com