java - 编写 Java 谓词以将列表与另一个列表进行比较

标签 java lambda java-stream

我正在尝试使用流编写 Java lambda 表达式来执行以下代码的操作。给定一个人员列表和一个DateFilter 列表,从人员列表中删除出生日期与DateFilter 列表中某个范围内的任何日期相匹配的任何人员。

    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);
        }
    }

有没有简化的方法来做到这一点?

谢谢

最佳答案

鉴于您的要求:

Given a List of Person and a List of DateFilter, remove any person from the persons list whose birthdate matches any of the dates withing a range in the DateFilter list.

听起来您的原始 people 列表的可变性不是问题。考虑到这一点,您可以使用 removeIf 函数简化您的代码,该函数也采用 Predicate 并摆脱一些样板代码 + 避免创建新的 List :

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

然后您的 people 列表将清除所有与谓词不匹配的 Person

关于java - 编写 Java 谓词以将列表与另一个列表进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38646356/

相关文章:

java - 在参数中给定多个条件时过滤流

c# - lambda 中的动态 where 子句

java - 读取 csv 文件并在 Lambda (Java8) 中过滤特定列

java - 如何限制ParallelStream中的并行执行数量?

java - 在 Java 中使用线程时如何安全地递增

c++ - 在 C++ 中使用 auto 声明 lambda 变量的首选方法是什么?

arraylist - Java8 Streams-比较两个列表的对象值并将值添加到第一个列表的子对象吗?

java - 列出时未获取 JPA 实体持久字段

java - Spring Boot单元测试断言错误

java - Android中传递 vector 、获取ArrayList