2017-06-22 4 views
3

後に例外をスローした場合、フィルタリングのJavaストリームを継続する必要があります戻ってきた。は、私はこのコードを持っているマップは、フィルタとFindFirstの

代わりに、リスト内の残りの項目のテストを続け、フィルタに一致する次の項目をマップします。

ストリームとラムダでどうすればいいですか?

私はこのより命令的なコードに変換できますが、機能的な解決策を探したいと思います。それがストリームにだけ(最大で)単一の要素を減らし、あなたが「戻って」とその後の多くを得ることができないので

for (MyListItem myList : listItem) { 
    try { 
     if (listItem.matchesCondition()) { 
      return Optional.of(listItem.getResult()); 
     } 
    } catch (Exception e) { 

     // SWALLOW THE EXCEPTION SO THE NEXT ITEM IS TESTED 

     // log error 
    } 
} 

return Optional.empty(); 

答えて

3

あなたは、非常に最後までfindFirstを移動する必要があります。

return myList 
    .stream() 
    .filter(Objects::nonNull) 
    .filter(...) 
    .map(...) // returns null on Exception, so filter again 
    .filter(Objects::nonNull) 
    .findFirst() 
+1

また、代わりに.MAP 'のあなたは' .flatMap(listItemのを使用することができ.filter(オブジェクト::非NULL) '(例外ではnullに) - > {しようと{返すStream.of(listItem.getResult( ));} catch(Exception e){return null;}}) '。 'flatMap'演算は' Stream.empty() 'のように' null'を扱います。 – Holger

+0

@Holger。私はそれについて考えました(または、Option.ofと同様のフラットマップ)。しかし、それはフィルタ(:: nonNull)と同様に騒々しいです。 Scalaの '.flatMap(Try(....)。toOption) 'のようなものをストリームの中の例外を無視するだけでいいですか? – Thilo

+1

さて、あなたはそれを正確に行うユーティリティメソッドを作ることができます。 – Holger

関連する問題