Как преобразовать список объектов в отображение <Строка, список>?

#java #java-stream

#java #java-поток

Вопрос:

У меня есть список пользователей

Collection<User> userList = groupManager.getUserList(groupName);

Не зная Java-Streams API настолько хорошо, я хочу сопоставить их с картой следующим образом: ключом будет ключ пользователя, а значением будет список других свойств пользовательского объекта.

 Map<String, List<String>> userDsiplayData = userList.stream()
     .collect(Collectors.toMap(User::getKey, **.......**))
 

Я попытался заменить ** ….. ** с Arrays.asList(User::getUsername(), User::getDisplayName(), User::getEmail()) или подобными конструкциями, но, похоже, я не могу заставить его работать.

Ответ №1:

Просто используйте лямбда:

 Map<String, List<String>> userDsiplayData = userList.stream()
     .collect(Collectors.toMap(User::getKey, 
         user -> List.of(user.getUsername(), user.getDisplayName(), user.getEmail()))
 

И, кстати, ваша Arrays.asList(User::getUsername(), User::getDisplayName(), User::getEmail()) часть неверна — вы пытаетесь вернуть список дескрипторов методов, а не функцию сопоставления (помимо того факта, что это не синтаксически правильно — скобки там неуместны).

Комментарии:

1. В Java 9 или выше вы также можете использовать List.of(...) вместо Arrays.asList(..) , с дополнительным преимуществом, заключающимся в том, что список является неизменяемым (вместо только фиксированного размера).

Ответ №2:

В вашем случае сбор должен быть таким:

 .collect(Collectors.toMap(
        User::getKey, 
        u -> Arrays.asList(u.getUsername(), u.getDisplayName(), u.getEmail())));
 

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

 public class User {
    private String key;
    private String username;
    private String displayName;
    private String email;

    // getters setters

    public List<String> getUserInfo() {
        return Arrays.asList(username, displayName, email)));
    }
}
 

и затем вы можете вызвать его, используя ссылку на метод следующим образом:

 .collect(Collectors.toMap(User::getKey, User::getUserInfo));