背景
从数据库或第三方数据源查询出数据是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 版权协议,转载请附上原文出处链接和本声明。