Как создать два разных дополнительных списка, используя один и тот же ввод - PullRequest
0 голосов
/ 20 декабря 2018

В моем предыдущем вопросе - Как отфильтровать возраст при группировке по карте со списком Мне удалось найти название для возрастных групп, используя List<User> users.Сейчас я пытаюсь найти различные группы пользователей по возрастам в соответствии с пороговым значением.Я попробовал это

List<User> userAboveThreshold = users.stream().filter(u -> u.getAge() > 21).collect(toList());
List<User> userBelowThreshold = users.stream().filter(u -> u.getAge() <= 21).collect(toList());

На этот раз это работает, я вижу, используя

userAboveThreshold.forEach(u -> System.out.println(u.getName() + " " + u.getAge()));
userBelowThreshold.forEach(u -> System.out.println(u.getName() + " " + u.getAge()));

Но мне нужно снова получить доступ к списку users , чтобы найти список бесплатных.Разве это не может быть сделано проще?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

List.removeAll

Вы можете использовать removeAll для получения бесплатного списка.

List<User> userBelowThreshold = new ArrayList<>(users); // initiated with 'users'
userBelowThreshold.removeAll(userAboveThreshold);

Примечание : для этого потребуетсяПереопределена реализация equals и hashCode для User.


Collectors.partitioningBy

С другой стороны, если вы хотите продолжить итерациюполный users список всего один раз , вы можете использовать Collectors.partitioningBy как:

Map<Boolean, List<User>> userAgeMap = users.stream()
        .collect(Collectors.partitioningBy(user -> user.getAge() > 21, Collectors.toList()));
List<User> userAboveThreshold = userAgeMap.get(Boolean.TRUE);
List<User> userBelowThreshold = userAgeMap.get(Boolean.FALSE);
0 голосов
/ 20 декабря 2018

Вы после partitioningBy коллектор:

Map<Boolean, List<User>> result = 
             users.stream().collect(partitioningBy(u -> u.getAge() > 21));

Затем используйте его следующим образом:

List<User> userAboveThreshold = result.get(true);
List<User> userBelowThreshold = result.get(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...