List<User>和List<Map>转Map

  • Post author:
  • Post category:其他




背景

从数据库或第三方数据源查询出数据是List格式的,但是我们有时候为了判断一个元素在不在集合中,为了效率,就需要转换成Map去判断,毕竟O(1)还是很香的。



事例

User实体类

@Data
class User{
    private String id;
    private String name;
    private String age;
}



1. List<User> 转为Map<String, User>

将list集合转为key为id,value为user对象的map,key有重复则保留先前的

public static void main(String[] args) {
        List<User> list = new ArrayList<>(3);
        User user1 = User.builder().id("1").name("laowang").age(18).build();
        User user2 = User.builder().id("2").name("lisi").age(18).build();
        User user3 = User.builder().id("3").name("zhangsan").age(18).build();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        System.out.println(list); // [User(id=1, name=laowang, age=18), User(id=2, name=lisi, age=18), User(id=3, name=zhangsan, age=18)]
        Map<String, User> id2UserMap = list.stream().collect(Collectors.toMap(User::getId, obj -> obj, (k1, k2) -> k1));
        System.out.println(id2UserMap); //{1=User(id=1, name=laowang, age=18), 2=User(id=2, name=lisi, age=18), 3=User(id=3, name=zhangsan, age=18)}
    }



2. List<User> 转为Map<String,String>

将list集合转为key为id,value为name的map,key有重复则保留先前的

public static void main(String[] args) {
        List<User> list = new ArrayList<>(3);
        User user1 = User.builder().id("1").name("laowang").age(18).build();
        User user2 = User.builder().id("2").name("lisi").age(18).build();
        User user3 = User.builder().id("3").name("zhangsan").age(18).build();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        System.out.println(list); // [User(id=1, name=laowang, age=18), User(id=2, name=lisi, age=18), User(id=3, name=zhangsan, age=18)]
        Map<String, String> id2NameMap = list.stream().collect(Collectors.toMap(User::getId, User::getName, (k1, k2) -> k1));
        System.out.println(id2NameMap); //{1=laowang, 2=lisi, 3=zhangsan}
    }



3. List<Map<String,String> 转为 Map<String,String>

有时候我们list存放的不是对象,而是一个个map,只要是一类map我们就可以当作对象来处理。

public static void main(String[] args) {
        List<Map<String, String>> list = new ArrayList<>(3);
        Map<String, String> map1 = new HashMap<>();
        map1.put("id", "11");
        map1.put("name","laowang");
        Map<String, String> map2 = new HashMap<>();
        map2.put("id", "22");
        map2.put("name","lisi");
        Map<String, String> map3 = new HashMap<>();
        map3.put("id", "33");
        map3.put("name","zhangsan");
        list.add(map1);
        list.add(map2);
        list.add(map3);
        System.out.println(list); //[{name=laowang, id=11}, {name=lisi, id=22}, {name=zhangsan, id=33}]

        Map<String, String> id2NameMap = list.stream().collect(Collectors.toMap(obj -> obj.get("id"), obj -> obj.get("name"), (k1, k2) -> k1));
        System.out.println(id2NameMap); //{33=zhangsan, 22=lisi, 11=laowang}
    }



4. List<Map<String,String>> 打平为一个Map<String,String>

有时候我们有一个list集合,里面的map存放有不同的字段,我们想把他们合并到一个map中,就可以利用 flatMap

public static void main(String[] args) {
        List<Map<String, String>> list = new ArrayList<>(3);
        Map<String, String> map1 = new HashMap<>();
        map1.put("id", "11");
        map1.put("name","laowang");
        Map<String, String> map2 = new HashMap<>();
        map2.put("id", "22");
        map2.put("address","beijing");
        Map<String, String> map3 = new HashMap<>();
        map3.put("uuid", "33-33");
        list.add(map1);
        list.add(map2);
        list.add(map3);
        System.out.println(list);  //[{name=laowang, id=11}, {address=beijing, id=22}, {uuid=33-33}]

        // 方式一打平
        Map<String, String> collect = list.stream().map(Map::entrySet).flatMap(Set::stream).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k1, k2) -> k1));
        System.out.println(collect); //{address=beijing, name=laowang, id=11, uuid=33-33}

        // 方式二打平
        Map<String, String> collect1 = list.stream().flatMap(obj -> obj.entrySet().stream()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k1, k2) -> k1));
        System.out.println(collect1); //{address=beijing, name=laowang, id=11, uuid=33-33}
    }



版权声明:本文为mojiewangday原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。