У меня есть карта объекта
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, у которого есть только идентификатор, имя и страна.




Используйте 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 Странно, должен быть доступен метод getKey. Не могли бы вы опубликовать обновленный код? Чтобы иметь и имя, и страну, вам нужно создать новый конкретный экземпляр класса.
извините, то, что вы разместили, сработало, я обновил свой вопрос, наверное, я изначально не понял
В этом ответе используется 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());
}));
Спасибо, это тоже сработало отлично, спасибо за добавленные комментарии
Не заполняйте эти значения при инициализации объекта User.