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 表达式是该接口的一个实现,因此无论其他代码做什么,它都不会抛出任何异常。