2016-08-08 2 views
5

Я использую следующее выражение, чтобы отфильтровать список людей, чей день рождения соответствует критериям.Как захватить Список удаленных элементов из Java 8 Stream filtering?

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

Collectors.toList() возвращает список людей, соответствующих критериям. Мне интересно, как захватить список людей, которые были удалены для цели отладки/ведения журнала. Один из возможных способов - запустить список через другой фильтр, но это будет неэффективно. Можем ли мы сделать это в одном и том же фильтре?

+2

Ну, если вы не хотите фильтровать какие-либо элементы ou t, то вы можете просто отобразить, сгруппировать по результату и свести к двум различным спискам вывода. – midor

ответ

6

Да, вы можете сделать это в том же 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()); 

Другой альтернативой является разделение списка ввода в двух списков на основе фильтра предиката:

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

Альтернатива очень крутая! Благодаря! – javakurious

0

Вы можете просто удалить соответствующие люди из коллекции людей:

people.removeAll(matchingPeople); 
+1

Этот подход может стать действительно запутанным, потому что он изменяет состояние оригинальной коллекции - используйте с осторожностью/осторожностью/лучше еще не на всех. – Bwvolleyball

Смежные вопросы