In my previous question - How to filter the age while grouping in map with list I was able to find the name to age groups using List. Now I am
You can use removeAll to obtain the complimentary list.
List<User> userBelowThreshold = new ArrayList<>(users); // initiated with 'users'
userBelowThreshold.removeAll(userAboveThreshold);
Note: This would require overridden equals and hashCode implementation for User.
On the other hand, if you further want to iterate over the complete users list just once, you can use Collectors.partitioningBy as:
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);
You're after the partitioningBy collector:
Map<Boolean, List<User>> result =
users.stream().collect(partitioningBy(u -> u.getAge() > 21));
Then use it as follows:
List<User> userAboveThreshold = result.get(true);
List<User> userBelowThreshold = result.get(false);