Java 8 のラムダ式と例外ストリーム: メソッドを安全にフィルタリングする
ラムダ式は Java コーディングに革命をもたらし、簡潔で表現力豊かな関数型プログラミング手法を可能にしました。ただし、提供されている例のように、例外をスローする可能性のあるメソッドを扱う場合、Java 8 ストリーム操作でコンパイルの問題が発生する可能性があります。
問題
コード スニペットは、次のことを試みます。 IOException をスローする isActive() メソッドに基づいて Account オブジェクトのストリームをフィルタリングします。 Java ではストリーム内でチェック例外を明示的に処理する必要があるため、フィルタリング操作はコンパイルに失敗します。
解決策
この問題に対処するには、潜在的な例外を処理する必要があります。ラムダ式をエスケープする前に。これは、ラムダ内の try-catch ブロック内で isActive() メソッド呼び出しをラップすることで実現できます:
<code class="java">s = s.filter(a -> { try { return a.isActive(); } catch (IOException e) { throw new UncheckedIOException(e); } });</code>
チェックされた IOException を UncheckedIOException に変換することで、例外は問題を引き起こすことなくストリーム内で安全に伝播できます。コンパイル エラー。
代替メソッド
または、uncheckCall() メソッドを使用して、中間変換に依存せずにチェック例外を処理できます。
<code class="java">return s.filter(a -> uncheckCall(a::isActive)) .map(Account::getNumber) .collect(toSet());</code>
このアプローチは、ラムダ式の簡潔さを維持しながらチェック例外を処理する便利な方法を提供します。
注意
チェック例外の変換の潜在的な影響を考慮することが重要です。例外はチェックされていないものに追加されます。これにより、ストリーム操作での例外処理が簡素化されますが、メソッド シグネチャから潜在的な例外の直接的な指示も削除されます。この方法で例外を処理することが望ましい動作と一致するかどうか、慎重に検討する必要があります。
以上がJava 8 で例外をスローするオブジェクトのストリームを安全にフィルタリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。