使用Stream API按权限对用户进行分组

时间:2019-03-13 15:03:09

标签: java java-8 java-stream grouping

我有一个任务:给一个用户列表,每个用户都有一些特权,然后按特权对用户进行分组。我应该使用流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

1 个答案:

答案 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())));
}