Удаление определенных элементов из объекта на карте

У меня есть карта объекта

Map<Integer, User> где идентификатор пользователя сопоставляется с объектом пользователя, который имеет идентификатор, имя, фамилию, имя, адрес электронной почты, почтовый индекс, страну, штат

Как мне уменьшить его до карты, которая имеет только идентификатор и имя, другая информация о пользователе не имеет значения.

--РЕДАКТИРОВАТЬ

извините, я не ясно выразился в своем вопросе, я в основном хочу перейти от

0 : {id: 0, name: 'test0', country: 'us', firstName: 'ft0', lastName: 'lt0'},
1 : {id: 1, name: 'test1', country: 'us', firstName: 'ft1', lastName: 'lt1'},
2 : {id: 2, name: 'test2', country: 'us', firstName: 'ft2', lastName: 'lt2'}

к

0 : {id: 0, name: 'test0', country: 'us'},
1 : {id: 1, name: 'test1', country: 'us'},
2 : {id: 2, name: 'test2', country: 'us'}

Также у меня есть класс User, который имеет все свойства пользователя, и класс UserV2, у которого есть только идентификатор, имя и страна.

Не заполняйте эти значения при инициализации объекта User.

Atul 18.02.2019 22:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте Stream, чтобы избежать состояния временный.

final Map<String, String> output = 
           input.entrySet()
                .stream()
                .collect(Collectors.toMap(
                    o -> o.getKey(),              
                    o -> o.getValue().getName()
                ));

Collectors.toMap принимает два функциональные интерфейсы в качестве входных параметров

toMap(Function<? super T, ? extends K> keyMapper,  // Returns the new key, from the input Entry
      Function<? super T, ? extends U> valueMapper // Returns the new value, from the input Entry
) { ... }

Чтобы справиться с этим вариантом использования, вам нужно создать новое упрощенное представление пользователя.

public class SimpleUser {
    public final String id;
    public final String name;
    public final String country;

    private SimpleUser(
            final String id,
            final String name,
            final String country) {
        this.id = id;
        this.name = name;
        this.country = countr;
    }

    public static SimpleUser of(
            final String id,
            final String name,
            final String country) {
        return new SimpleUser(id, name, country);
    }
}

Чем ты просто

.collect(Collectors.toMap(
       o -> o.getKey(),
       o -> {
          final User value = o.getValue();
          return SimpleUser.of(user.getId(), user.getName(), user.getCountry());
       }
));

Я попробовал это, и он говорит, что не может разрешить метод getKey(). Кроме того, если бы я хотел, чтобы на новой карте было имя пользователя и страна, как мне это сделать?

JDunn 18.02.2019 23:25

@JDunn Странно, должен быть доступен метод getKey. Не могли бы вы опубликовать обновленный код? Чтобы иметь и имя, и страну, вам нужно создать новый конкретный экземпляр класса.

LppEdd 18.02.2019 23:27

извините, то, что вы разместили, сработало, я обновил свой вопрос, наверное, я изначально не понял

JDunn 18.02.2019 23:34

В этом ответе используется Java-потоки. Метод collect может принимать Collector. Вот этот берет каждую пару (Integer, User) и создает пару (Integer, UserV2).

Map<Integer, UserV2> userIdToUserV2 = users.entrySet().stream()
    // Map (Integer, User) -> (Integer, UserV2)
    .collect(Collectors.toMap(
        // Use the same Integer as the map key
        Map.Entry::getKey,
        // Build the new UserV2 map value
        v -> {
            User u = v.getValue();
            // Create a UserV2 from the User values
            return new UserV2(u.getId(), u.getName(), u.getCountry());
        }));

Спасибо, это тоже сработало отлично, спасибо за добавленные комментарии

JDunn 19.02.2019 16:49

Другие вопросы по теме