#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));