JDK8特性--Stream(求和,过滤,排序) 这里是其他一些stream的有用法,有需要的可以看看。
言归正传,现在主要是是学习list转map,使用的方法是Stream中Collectors的toMap方法:Collectors.toMap。
首先我们构造一个list
//声明一个List集合
List<People> list = new ArrayList();
list.add(new People("小A", "数学"));
list.add(new People("小B", "语文"));
list.add(new People("小C", "英语"));
System.out.println(list.toString());
//将list转换map
打印结果如下
1.普通转换
Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse));
System.out.println(map);
打印结果如下
2.有相同key时,会报错
同样构建一个list
//声明一个List集合
List<People> list = new ArrayList();
list.add(new People("小A", "数学"));
list.add(new People("小B", "语文"));
list.add(new People("小C", "英语"));
list.add(new People("小C", "历史")); //新增行
System.out.println(list.toString());
list打印如下:
这样如果还如上面的转化 。
会报错,错误如下:
![]()
解决办法:
2.1 留下一个
//将list转换map,->箭头后的值是当遇到相同时,留下第一个还是第二个
Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse,(key1 , key2)-> key2 ));
System.out.println(map);
打印如下:
![]()
2.2重复时将前面的value 和后面的value拼接起来
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(key1 , key2)-> key1+","+key2 ));
System.out.println(map);
打印结果如下:
![]()
2.3 重复时将重复key的数据组成集合
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(People::getName,
p -> {
List<String> getNameList = new ArrayList<>();
getNameList.add(p.getCourse());
return getNameList;
},
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
System.out.println(map);
打印结果如下:
3.字段为空的情况,会出现空指针异常。
构建一个list,普通转换
//声明一个List集合
List<People> list = new ArrayList();
list.add(new People("小A", "数学"));
list.add(new People("小B", "语文"));
list.add(new People("小C", null));
System.out.println(list.toString());
//将list转换map,->箭头后的值是当遇到相同时,留下第一个还是第二个
Map<String, String> map = list.stream().collect(Collectors.toMap(People::getName, People::getCourse));
System.out.println(map);
报错如下:
![]()
3.1解决办法如下:
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(People::getName,
p -> {
List<String> getNameList = new ArrayList<>();
getNameList.add(p.getCourse());
return getNameList;
},
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
System.out.println(map);
打印结果如下:
本文介绍了Java 8 Stream API中如何使用Collectors的toMap方法将List转换为Map,包括普通转换、处理重复Key的策略以及处理字段为空的情况。在遇到重复Key时,提供了保留第一个、合并值以及创建值集合的解决方案,并展示了在字段为空时避免空指针异常的方法。

3103





