あなたは次のインターフェイスを公開するサードパーティのライブラリを持って言うことができます。
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の文脈でチェック例外に対処するための最善のアプローチは、ストリーム(とラムダ式のより広い文脈で)?
ありがとう!
あなたは基本的に2つの実行可能なオプションをリストアップしました。
もう一つの選択肢は、することですチェック例外は、ストリーム処理機能のうちスローさせる(「伝播」または「こっそり」チェック例外)。これは、チェック例外をキャッチして、それを再スローすることによって行われますRuntimeException
(キャストすることにより)。見てみましょう、この偉大な答え詳細については、を。
複数のライブラリは、ストリームAPIに例外処理に対処するために開発されています。たとえば、次のNoExceptionライブラリを見てとることができhttps://noexception.machinezoo.com/を
それはあなたのスニーク/オンまたはオフの例外を無視/ログ/ラップする便利な方法を提供します。
たとえば、あなたのケースでは、それは次のようになります。
.map(value -> Exceptions.sneak().function(mapper::doMap))
若しくは
.map(value -> Exceptions.wrap().function(mapper::doMap))
PS:私は、ライブラリの作者、また貢献ないんだけど、私はいくつかのプロジェクトでこのライブラリを使用しました。