如何使用相同的输入创建两个不同的互补列表

时间:2018-12-20 13:26:02

标签: java java-stream

在上一个问题-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()));

但是我必须再次访问用户列表才能找到免费列表。难道这不简单吗?

2 个答案:

答案 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