如何从Java 8 Stream过滤中捕获已删除项目的列表?

jav*_*ous 7 java java-8 java-stream

我使用以下表达式来过滤生日符合条件的人员列表.

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

Collectors.toList()返回符合条件的人员列表.我想知道如何捕获为调试/记录目的而被删除的人员列表.一种可能的方法是通过另一个过滤器运行列表,但这将是低效的.我们可以在同一个过滤器中进行吗?

Era*_*ran 10

是的,您可以在同一个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());
Run Code Online (Sandbox Code Playgroud)

另一种方法是根据过滤谓词将输入列表分为两个列表:

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