Java 8: Lambda ストリームと例外処理
Java 8 では、ラムダ式はストリーム処理に多くの利点をもたらします。ただし、IOException などのチェック例外をスローするメソッドを扱う場合、開発者はコンパイル エラーに遭遇する可能性があります。
次のコードを検討してください。
<code class="java">class Bank { public Set<String> getActiveAccountNumbers() throws IOException { Stream<Account> s = accounts.values().stream(); s = s.filter(a -> a.isActive()); Stream<String> ss = s.map(a -> a.getNumber()); return ss.collect(Collectors.toSet()); } }</code>
このコードは、アクティブ化された一連のオブジェクトを取得することを目的としています。口座番号。ただし、isActive メソッドと getNumber メソッドが IOExceptions をスローするため、コンパイルは失敗します。IOException はキャッチされるか、シグネチャ内で宣言される必要があります。
ラムダ式でのチェックされた例外のキャッチ
この問題を解決するには、チェック例外をラムダ式自体の中で処理する必要があります。ただし、ラムダ内に try-catch ブロックを配置するだけでは十分ではありません。例外は、ラムダのスコープをエスケープする前にキャッチする必要があります。
UncheckedIOException ラッパーの使用
1 つの方法は、チェックされた例外を変換するカスタム ラッパー クラス UncheckedIOException を使用することです。未チェックのものに。これにより、ラムダがチェックされていない例外をスローし、ストリームの後続の操作で処理できるようになります。
<code class="java">s = s.filter(a -> { try { return a.isActive(); } catch (IOException e) { throw new UncheckedIOException(e); } });</code>
汎用例外ラッパーの使用
別のオプションは、汎用ラッパー メソッド uncheckCall は、あらゆるタイプの例外をキャッチし、未チェック例外として再スローします。
<code class="java">return s.filter(a -> uncheckCall(a::isActive)) .map(Account::getNumber) .collect(toSet());</code>
この場合、ストリームの後続の操作は未チェック例外を受け取り、それに応じて処理できます。
コンパイラの例外チェックの無効化
より高度なアプローチには、コンパイラの例外チェックを効果的に無効にするメソッドの使用が含まれます。ただし、これには注意が必要であり、潜在的なリスクを明確に理解する必要があります。このアプローチでは、次のコードが使用されます。
<code class="java">public static <T> T uncheckCall(Callable<T> callable) { try { return callable.call(); } catch (Exception e) { sneakyThrow(e); return null; // Unreachable but needed to satisfy compiler } }</code>
このメソッドでは、チェックされた例外がキャッチされ、ランタイム例外として再スローされます。ただし、例外がラムダの実行サイトで処理されることを意図している場合、このアプローチは予期しない動作を引き起こす可能性があることに注意することが重要です。
以上がJava 8 Lambda ストリームでチェックされた例外を処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。