2016-07-28 6 views
1

私は、次のコードが何をしているのかをストリームでJavaラムダ式を書こうとしています。 人物リストDateFilterリストが与えられている場合、DateFilterリストの範囲内の日付と生年月日が一致する人物リストを削除します。リストを別のものと比較するJava述語を書く

List<Person> people = getPerson(); 
    List<DateFilter> dateFilters = getDateFilters();   
    List<Person> filteredPersons = new ArrayList<>(); 

    for(Person p : people){ 
     boolean isWithinRange = false; 
     for(int i = 0; i < dateFilters.size() && !isWithinRange; i++){ 
      DateFilter dateFilter = dateFilters.get(i); 
      if(numOfDaysBetween(p.getBirthDate(),dateFilter.getDate()) < dateFilter.getDiffRange()){ 
       isWithinRange = true; 
      } 
     } 
     if(!isWithinRange){ 
      filteredPersons.add(p); 
     } 
    } 

これを行う簡単な方法はありますか?

ありがとうございました

+0

彼はすでに彼のコードを示しました。それは働いていますが、彼はそれをいかに単純化するかを尋ねています。彼はJava 8ストリーム/ lambdaを使ってこのコードを書き換えたいと思っています。そう、@ user1309197? – spirit

+2

@spirit:いいえ、彼はストリームなしで彼のコードを示しました。彼はストリームで彼の試みを示していない。 –

+0

はい、おそらく彼はそれをする方法を知らないので)助けを求めているのですか?)) – spirit

答えて

3

者のリストとDateFilterの一覧を考えると、その誕生日DateFilterリストに 範囲をwithing日付のいずれかに一致する人物の一覧から任意の人物 を削除します。

オリジナルの可変性のように聞こえますpeopleリストに問題はありません。

people.removeIf(person -> dateFilters.stream() 
    .noneMatch(f -> numOfDaysBetween(person.getBirthDate(), f.getDate()) < f.getDiffRange())); 

その後、あなたのpeopleリストは任意のPersonから清掃されます。これを考慮し、あなたもPredicateを取り、いくつかの定型的なコードを取り除く+新しいListの作成を避けるremoveIf機能を使用して、コードを簡素化することができますそれは述語と一致しませんでした。

+2

ほとんどの状況で変更可能性について助言している限り、これはあなたが望むものであれば非常に良い答えです。それは元のコードがしたものではありません。 –

+1

美しい解決策! @MarkPetersの提案を受け取り、Include()メソッドをDateFilterクラスに追加して、よりクリーンなものにしました。私はそれを正解とマークします。私は、インラインフィルタを記述するのではなく、このフィルタを返す別のメソッドを記述できるかどうかを確認しようとしています。 – javakurious

+0

user1309197 @確かにすることができます: '述語 isInvalidPerson =人 - > dateFilters.stream() .noneMatch(F - > numOfDaysBetween(person.getBirthDate()、f.getDate())

3

ストリーム操作は2つあります。私はあなたがこのかかわらような何かを行うことができるように、あなたのDateFilterクラスにメソッドを追加することをお勧めします

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

peopleをフィルタリングするための、もう1つはあなたの DateFilter秒のすべてに対して述語を作成するには1
dateFilters.stream().anyMatch(df -> df.includes(p.getBirthDate())) 

日付一致の算術演算は、DateFilterクラスに適しています。あなたの条件を考えると

関連する問題