Группировка пользователей по привилегиям с помощью Stream API - PullRequest
0 голосов
/ 13 марта 2019

У меня есть задача: учитывая список пользователей, каждый из которых обладает некоторыми привилегиями, группировать пользователей по привилегиям. Я должен использовать потоковый API. Это единственный код, который мне пришёл в голову:

public Map<Privilege, List<User>> groupByPrivileges(List<User> users) {
    return users.stream().collect(groupingBy(User::getPrivileges));
}

Как вы можете видеть в возвращаемом типе метода, мне нужно получить карту с единичными объектами привилегий в качестве ключей, но пользователь может появляться несколько раз под разными ключами, если у них есть несколько привилегий.

Основная проблема в том, что User::getPrivilege s возвращает List<Privilege>, и я знаю только, как обработать один Privilege.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете создать запись для каждой привилегии в списке, а затем группировать по:

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