当前位置: 首页 > 图灵资讯 > 技术篇> Java8新特性Stream之list转map及问题解决

Java8新特性Stream之list转map及问题解决

来源:图灵教育
时间:2023-06-12 09:25:24

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);