从地图中的对象中删除某些元素

时间:2019-02-18 21:27:31

标签: java object

我有一个对象Map

Map<Integer, User>,其中用户ID映射到具有ID,名字,姓氏,名称,电子邮件,邮政编码,国家/地区,状态的用户对象

如何将其简化为仅包含ID和名称的地图,而其他用户信息无关。

-编辑

抱歉,我不清楚我的问题,我基本上想离开

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类和一个仅具有ID,名称和国家/地区的UserV2类

2 个答案:

答案 0 :(得分: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());
       }
));

答案 1 :(得分:0)

此答案使用Java Streamscollect方法可以接受CollectorThis one接受每个(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());
        }));