ハンドルはJava8ストリームで例外をチェックします

user10367961:

あなたは次のインターフェイスを公開するサードパーティのライブラリを持って言うことができます。

interface Mapper {

    String doMap(String input) throws CheckedException;

}

class CheckedException extends Exception {

}

私は一般的に、Javaでの悪い習慣を意識チェック例外をしているのですが、このコードは、サードパーティから来ていると私はそれを変更することはできません。

私はJava8はAPIをストリームとの組み合わせでマッパーインタフェースの実装を使用します。以下のサンプル実装を考えてみましょう。

class MapperImpl implements Mapper {

    public String doMap(String input) throws CheckedException {
        return input;
    }

}

今、私は例えば、文字列のコレクションにマッパーを適用したいと思います。

public static void main(String[] args) {
    List<String> strings = Arrays.asList("foo", "bar", "baz");
    Mapper mapper = new MapperImpl();

    List<String> mappedStrings = strings
            .stream()
            .map(mapper::doMap)
            .collect(Collectors.toList());
}

機能CheckedExceptionを処理する方法を知りませんが、doMapによって宣言されたので、コードは、コンパイルに失敗します。私は2つの可能な解決策を思い付きました。

溶液#1 - ラップ呼び出し

.map(value -> {
                try {
                    return mapper.doMap(value);
                } catch (CheckedException e) {
                    throw new UncheckedException();
                }
            })

ソリューション#2 - ユーティリティメソッドを書きます

public static final String uncheck (Mapper mapper, String input){
    try {
        return mapper.doMap(input);
    } catch (CheckedException e){
        throw new UncheckedException();
    }
}

そして、私が使用することができます

.map(value -> Utils.uncheck(mapper, value))

どちらが、あなたの意見では、Java8の文脈でチェック例外に対処するための最善のアプローチは、ストリーム(とラムダ式のより広い文脈で)?

ありがとう!

アレックスShesterov:

あなたは基本的に2つの実行可能なオプションをリストアップしました。

もう一つの選択肢は、することですチェック例外は、ストリーム処理機能のうちスローさせる(「伝播」または「こっそり」チェック例外)。これは、チェック例外をキャッチして、それを再スローすることによって行われますRuntimeException(キャストすることにより)。見てみましょう、この偉大な答え詳細については、を。

複数のライブラリは、ストリームAPIに例外処理に対処するために開発されています。たとえば、次のNoExceptionライブラリを見てとることができhttps://noexception.machinezoo.com/を

それはあなたのスニーク/オンまたはオフの例外を無視/ログ/ラップする便利な方法を提供します。

たとえば、あなたのケースでは、それは次のようになります。

.map(value -> Exceptions.sneak().function(mapper::doMap))

若しくは

.map(value -> Exceptions.wrap().function(mapper::doMap))

PS:私は、ライブラリの作者、また貢献ないんだけど、私はいくつかのプロジェクトでこのライブラリを使用しました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=189421&siteId=1