ストリームをフィルタリングするときに Java 8 ラムダ式で例外を処理する方法は?

Patricia Arquette
リリース: 2024-10-26 04:54:03
オリジナル
878 人が閲覧しました

How to Handle Exceptions in Java 8 Lambda Expressions When Filtering Streams?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート