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()); } } interface Account { boolean isActive() throws IOException; String getNumber() throws IOException; }</code>
このコードは、ラムダ式内の isActive メソッドと getNumber メソッドによってスローされた IOException。
これを解決するには、ラムダをエスケープする前に例外をキャッチする必要があります。
<code class="java">s = s.filter(a -> { try { return a.isActive(); } catch (IOException e) { throw new UncheckedIOException(e); } });</code>
ラムダは次のように評価されます。チェック例外が宣言されていない別のコンテキストでは、チェック例外を非チェック例外の中にラップします。
あるいは、コンパイラの例外チェックを解除するメソッドを使用することもできます。
<code class="java">return s.filter(a -> uncheckCall(a::isActive)) .map(Account::getNumber) .collect(toSet());</code>
ここで、uncheckCall は次のように定義されます:
<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 でストリームでラムダ式を使用するときにチェックされた例外を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。