List集合转Map,采用StreamCollectorstomap方法:Collectors.toMap
具体用法如下:
///声明List集合
List list = new ArrayList();
list.add(new Person("1001", “小a”));
list.add(new Person("1002", 小B));
list.add(new Person("1003", (小C);
System.out.println(list);
///将list转换为mapp
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
System.out.println(map);
注:用Collectorstomap方法转换List,通常会遇到两个问题。一是转换map,key重复问题;另一种是空指针异常,即转换为map的value为null。
解决问题!!!
第一,第一个问题报告的错误如下:Duplicate key
原因是在声明List集合时,有些值重复,如图所示:
解决方案:(分三种,具体看业务需求)
1.重复使用后面的value 覆盖前面的value
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key2 ));
System.out.println(map);
2.重复前面的value 与后面的value拼接;
Map map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> “key1+” ));
System.out.println(map);
3.重复时集合重复key的数据
Map> map = list.stream().collect(Collectors.toMap(Person::getId,
p -> {
getNameList = new ArrayList<>();
getNameList.add(p.getName());
return getNameList;
},
value2) -> {
value1.addAll(value2);
return value1;
}
));
System.out.println(map);
第二,第二个问题报告的错误如下:NullPointerException
原因是List集合时的一些值是空的(如图所示),但Hashmap中的k、v可以存储null值。
解决方案:在转换流中加入判空,即使value为空,仍然输出。(与上述方法三相同)
Map> map = list.stream().collect(Collectors.toMap(Person::getId,
p -> {
getNameList = new ArrayList<>();
getNameList.add(p.getName());
return getNameList;
},
value2) -> {
value1.addAll(value2);
return value1;
}
))
System.out.println(map);