7

この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のラムダは、エラー処理にあまり適していないようです...

4

3 に答える 3

10

私のアプローチは、ラムダからこっそりスローすることですが、メソッドがその節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メソッドで例外を宣言することにより、すべての呼び出し元の通常の動作を復元します。

于 2015-07-26T14:35:18.023 に答える
5

チェック済みの例外をスローできるようにする Stream APIの拡張機能を作成しました。

public Server send(String message) throws IOException {
    ThrowingStream.of(sessions, IOException.class)
        .parallelStream()
        .map(Session::getBasicRemote)
        .forEach(basic -> basic.sendText(message));

    return this;
}
于 2015-07-29T16:32:57.307 に答える
2

実際問題は、ラムダで使用されるすべて@FunctionalInterfaceの s が例外のスローを許可しないことです。未チェックの例外を除きます。

1 つの解決策は、私のパッケージを使用することです。それを使用すると、コードは次のようになります。

sessions.parallelStream()
    .map(Session::getBasicRemote)
    .forEach(Throwing.consumer(basic -> basic.sendText(message)));
return this;
于 2015-07-26T14:11:16.753 に答える