在上一个问题-How to filter the age while grouping in map with list中,我可以使用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()));
但是我必须再次访问用户列表才能找到免费列表。难道这不简单吗?
答案 0 :(得分:6)
您正在追捕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);
答案 1 :(得分:5)
List.removeAll
您可以使用removeAll
获取免费列表。
List<User> userBelowThreshold = new ArrayList<>(users); // initiated with 'users'
userBelowThreshold.removeAll(userAboveThreshold);
注意:这将要求equals
的{{1}}和hashCode
实现被重写。
Collectors.partitioningBy
另一方面,如果您进一步想遍历整个User
列表一次,则可以将users
用作:
Collectors.partitioningBy