2016-07-28 82 views
1

我正在嘗試使用流編寫Java lambda表達式來執行以下代碼的操作。給定人員列表列表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 streams/lambda重寫這段代碼。對,@ user1309197? – spirit

+2

@spirit:不,他在沒有流的情況下顯示他的代碼。他還沒有表現出他嘗試過溪流。 –

+0

是的,也許是因爲他不知道該怎麼做=)這就是爲什麼他要求幫助,我猜=)) – spirit

回答

3

鑑於您的要求:

特定人的名單和DateFilter的列表,從列表中的人,其出生日期相匹配的任何日期withing 在DateFilter列表的範圍中刪除任何人 。

聽起來像你的原始people列表的可變性不是問題。考慮到這一點,你可以簡單地用removeIf功能,還需要一個Predicate,擺脫一些樣板代碼+避免新的List創建代碼:

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

然後你people名單將從任何Person清洗這與謂詞不匹配。

+2

儘管我在大多數情況下建議不要使用可變性,但如果這是您想要的,這是一個非常好的答案。儘管這不是原來的代碼。 –

+1

美麗的解決方案!我採用了@MarkPeters建議,並在DateFilter類中添加了includes()方法,使其更加清潔。我會將其標記爲正確的答案。我只是想看看我是否可以編寫一個單獨的方法來返回此過濾器,而不是寫入內聯過濾器。 – javakurious

+0

@ user1309197當然可以: '謂詞 isInvalidPerson =人 - > dateFilters.stream() .noneMatch(F - > numOfDaysBetween(person.getBirthDate(),f.getDate())

3

您有兩個流操作;一個過濾people,以及一個針對所有DateFilter S的創建謂詞:

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

我會鼓勵你的方法添加到您的DateFilter類,這樣就可以做這樣的事情,雖然:

dateFilters.stream().anyMatch(df -> df.includes(p.getBirthDate())) 

日期匹配的算術更適合於DateFilter類。

相關問題