Java 8: Lambda-Streams - 例外をスローするメソッドによるフィルタリング
Java 8 のラムダ式は、データを操作および処理するための強力な方法を提供します。ただし、例外をスローする可能性のあるメソッドを扱う場合は、ラムダ式の制限を回避し、効果的な解決策を検討することが重要です。
問題:
次のコードを考えてみましょう。フラグメント:
<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()); } } interface Account { boolean isActive() throws IOException; String getNumber() throws IOException; }</code>
このコードは、isActive メソッドと getNumber メソッドによってスローされるチェック例外が原因でコンパイルに失敗します。例外はラムダ式内で適切に処理されないため、単に周囲の try-catch ブロックで例外をキャッチするだけでは十分ではありません。
解決策:
解決するにはこの問題では、ラムダ式をエスケープする前に例外をキャッチする必要があります。 1 つのアプローチは、次の変更されたコード部分に示すように、未チェック例外を使用することです。
<code class="java">s = s.filter(a -> { try { return a.isActive(); } catch (IOException e) { throw new UncheckedIOException(e); } });</code>
ここでは、ラムダ内で IOException をキャッチし、未チェック例外をスローして、ラムダ内で適切に処理されるようにします。 Expression.
あるいは、チェックされた例外をチェックされていない例外に変換するラッパー メソッドを使用することもできます。
<code class="java">return s.filter(a -> uncheckCall(a::isActive)) .map(Account::getNumber) .collect(toSet()); public static <T> T uncheckCall(Callable<T> callable) { try { return callable.call(); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } }</code>
これにより、ラムダ式を uncheckCall の呼び出しでラップすることができます。
その他の考慮事項:
特定の例外が引き続き例外を回避できるという事実に留意することが重要です。提案された解決策を使用した場合でも、ラムダ式。たとえば、収集オペレーションの評価中にスローされた例外は、引き続きラムダから伝播します。
以上がストリームをフィルタリングするときに Java 8 ラムダ式で例外を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。