Java 为什么在使用大括号时 lambda 中需要异常处理
Java why exception handling needed in lambda when use curly braces
我有两个函数抛出异常:
public void foo() throws Exception {
// something
}
public void bar() throws Exception {
// something
}
如果我在 lambda 表达式中使用大括号组合这些函数调用,它需要 try/catch 来处理异常。
public void someFunction() throws Exception {
someList.forEach(e -> {
// Show compile error and need try/catch
foo();
bar();
});
}
但是,如果我在 for-loop 中组合,就可以了。
public void someFunction() throws Exception {
for (SomeElement e : someList) {
foo();
bar();
}
}
我虽然 try/catch 需要,因为创建了新的闭包(使用括号),但在 for 循环中,它不需要。
我只是用 for 循环解决了它,但我想知道为什么会这样。
List#forEach
期望 Consumer
.
Consumer
是一个(单一抽象方法)接口,看起来像这样(简化):
@FunctionalInterface
public interface Consumer<T>{
void accept(T t);
}
如您所见,accept
不会抛出任何已检查的异常。
lambda 表达式是该接口的一个实现,因此无论其他代码做什么,它都不会抛出任何异常。
我有两个函数抛出异常:
public void foo() throws Exception {
// something
}
public void bar() throws Exception {
// something
}
如果我在 lambda 表达式中使用大括号组合这些函数调用,它需要 try/catch 来处理异常。
public void someFunction() throws Exception {
someList.forEach(e -> {
// Show compile error and need try/catch
foo();
bar();
});
}
但是,如果我在 for-loop 中组合,就可以了。
public void someFunction() throws Exception {
for (SomeElement e : someList) {
foo();
bar();
}
}
我虽然 try/catch 需要,因为创建了新的闭包(使用括号),但在 for 循环中,它不需要。 我只是用 for 循环解决了它,但我想知道为什么会这样。
List#forEach
期望 Consumer
.
Consumer
是一个(单一抽象方法)接口,看起来像这样(简化):
@FunctionalInterface
public interface Consumer<T>{
void accept(T t);
}
如您所见,accept
不会抛出任何已检查的异常。
lambda 表达式是该接口的一个实现,因此无论其他代码做什么,它都不会抛出任何异常。