Lambda引发异常


问题内容

鉴于此Java 8代码

public Server send(String message) {
    sessions.parallelStream()
        .map(Session::getBasicRemote)
        .forEach(basic -> {
          try {
            basic.sendText(message);
          } catch (IOException e) {
            e.printStackTrace();
          }
        });

    return this;
}

我们如何正确地将IOException其委派给方法调用的堆栈?(简而言之,如何使此方法抛出此错误IOException?)

Java中的Lambda看起来对错误处理不是很友好…


问题答案:

我的方法是从lambda 偷偷地
将其抛出,但是要小心,使该send方法在其throws子句中声明它。使用我在这里发布的Exceptional课程:

public Server send(String message) throws IOException {
  sessions.parallelStream()
          .map(Session::getBasicRemote)
          .forEach(basic -> Exceptional.from(() -> basic.sendText(message)).get());
  return this;
}

这样,您可以有效地使编译器仅“移开视线”,从而在代码中的某个位置禁用其异常检查,但是通过在send方法中声明异常,可以恢复其所有调用程序的常规行为。