2016-08-08 5 views
5

次の式を使用して、誕生日が条件と一致する人のリストをフィルタリングしています。Java 8ストリームフィルタリングから削除された項目のリストをキャプチャする方法はありますか?

List<Person> matchingPeople = people.stream() 
.filter(p -> dateFilters.stream() 
    .anyMatch(df -> 
     numOfDaysBetween(p.getBirthDate(), df.getDate()) < df.getDiffRange() 
    ) 
) 
.collect(Collectors.toList()); 

Collectors.toList()は、条件を満たす人々のリストを返します。デバッグ/ロギングの目的で削除された人のリストをどのように取得するのかと思います。 1つの可能な方法は、別のフィルタでリストを実行することですが、それは非効率的です。私たちは同じフィルターでそれを行うことはできますか?

+2

いいえ、任意の要素をフィルタしたくない場合は結果をグループ化し、2つの異なる出力リストにまとめることができます。 – midor

答えて

6

はい、あなたは同じfilterコールでそれを行うことができます。

List<Person> matchingPeople = 
    people.stream() 
      .filter(p -> { 
       if (dateFilters.stream() 
          .anyMatch(df -> numOfDaysBetween(p.getBirthDate(), df.getDate()) < df.getDiffRange() 
)) 
       { 
        return true; 
       } else { 
        //you can add here code to log elements that don't pass the filter 
        //or you can add these elements to an external List 
        return false; 
       } 
      }) 
      .collect(Collectors.toList()); 

別の方法としては、フィルター述語に基づいて2つのリストに入力されたリストを分割することです:

Map<Boolean, List<Person>> partition = 
    people.stream() 
      .collect(Collectors.partitioningBy(p -> <same code as in your filter method call>)); 
+0

代替は非常にクールです!ありがとう! – javakurious

0

あなたは単にすることができ一致する人を人物コレクションから削除する:

people.removeAll(matchingPeople); 
+1

このアプローチは、元のコレクションの状態を変更するため気になることがあります。注意/注意/より良い方法ではありません。 – Bwvolleyball

関連する問題