2016-07-28 84 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类。

相关问题