我有一个任务:给一个用户列表,每个用户都有一些特权,然后按特权对用户进行分组。我应该使用流API。这是我唯一想到的代码:
public Map<Privilege, List<User>> groupByPrivileges(List<User> users) {
return users.stream().collect(groupingBy(User::getPrivileges));
}
您可以在方法的返回类型中看到,我需要获取一个以单个Privilege对象作为键的映射,但是如果User具有多个特权,则在不同的键下,User可能会出现多次。
主要问题是User::getPrivilege
返回List<Privilege>
,而我只知道如何处理单个Privilege
。
答案 0 :(得分:0)
您可以为列表中的每个特权创建一个条目,然后在您收集为时进行分组:
public Map<Privilege, List<User>> groupByPrivileges(List<User> users) {
return users.stream()
.flatMap(user -> user.getPrivileges().stream()
.map(privilege -> new AbstractMap.SimpleEntry<>(privilege, user)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
}