Как преобразовать в Map

150
10 марта 2022, 22:40

Есть некий класс User. Как я могу его преобразовать в справочник, по принципу[номер телефона -> пользователь]. Знаю, что надо использовать Map, но не понимаю, что именно указывать в <>. Думал, может использовать stream. P.S. на вход получаю коллекцию пользователей.

public static class User {
        private String name;
        private int age;
        private String phone;
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public User(String phone) {
            this.phone = phone;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
    }

Моя реализация, но она выдает ошибку // Can not resolve method toMap()

public static int task2(Collection<User> source) {
        Collection<User> users = new ArrayList<>(source);
        Map<Integer, String> map = users.stream().collect(Collectors.toMap());
       return null;
    }
Answer 1

Если я вас правильно понял, то вот:

Map<String, User> map = new HashMap<>();
users.forEach(user -> map.put(user.getPhone(), user));
Answer 2

stream вполне можно использовать, но коллектору нужно указать, что брать в качестве ключа и значения. Сделать это можно передав соответствующие функции в toMap, например так:

Map<String, User> map = users.stream().collect(
    Collectors.toMap(User::getPhone, user -> user)
);

user -> user можно заменить на Function.identity()

В Вашей реализации Map был параметризован целым числом и строкой (Map<Integer, String>)...

Если это означает что Вы хотите получить справочник [номер телефона в числовом формате] -> [имя пользователя], то нужно будет поменять аргументы в toMap:

  1. user -> user на User::getName
  2. User::getPhone на функцию, которая будет вытаскивать номер телефона и трансформировать его в число, обрабатывая при этом ошибки конвертации и т.д. Очень желательно будт вынести это в отдельный метод
READ ALSO
Android. Java. Условие в Random.nextInt();

Android. Java. Условие в Random.nextInt();

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

144
Нужно вызвать ошибку JAVA

Нужно вызвать ошибку JAVA

Напишите строку вызова этой функции с такой строкой-паролем, чтобы возникло какое-нибудь исключение

118
Какой контейнер использовать?

Какой контейнер использовать?

Какой контейнерный класс можно использовать как ранилище строк таблицы, в которую часто вставляют в начало и в середину? Варианты: ArrayList LinkedList...

207
правильно описать OnSaveInstanceState (Java, Android)

правильно описать OnSaveInstanceState (Java, Android)

Использую в приложении два TextView, кнопку Button и ExoplayerПодскажите как правильно сделать сохранение состояния приложения при нажатии кнопки "Назад"...

86