JDK8stream将转地图列表对象报错java.lang.IllegalStateExcep

 JDK8stream将转地图列表对象报错. lang。IllegalStateExcep

JDK8有很多新特性,比如λ表达式,函数式编程以及流流的使用,这几个新特性,使用过之后就爱不释手了,比如将列表集合通过流可以直接转换成地图对象。

语法:

地图地图=list.stream.stream () .collect (Collectors.toMap(列表集合中对象::得到属性,列表对象别名→列表对象别名));

示例:

Map<整数,EmployeeTeacherCertificate>employeeTeacherCertificateMap=employeeTeacherCertificates.stream () .collect (Collectors.toMap (EmployeeTeacherCertificate:: getEmployeeId, cert→cert));

说明:

employeeTeacherCertificates列表集合对象

EmployeeTeacherCertificate:是列表中的集合对象

是不是很简单。

但是,如果列表中比如说empId有重复的话,就会报错。如下:

 JDK8stream将转地图列表对象报错. lang。IllegalStateExcep

错误信息说,employeeId=4429的值在集合中有重复的。

这个时候怎么解决呢?

我们可以使用toMap的另一个重载方法。带有去重的方法。

语法:

收藏家。toMap (keyMapper valueMapper mergeFunction)

源码:

 JDK8stream将转地图列表对象报错. lang。IllegalStateExcep

参数说明:

前两个参数都是与之前一样键和值得取值属性,第三个参数是当关键发生重复时处理的方法,注释上的解释如下:

 JDK8stream将转地图列表对象报错. lang。IllegalStateExcep

简单一句话:

一种合并函数,用于解决两者之间的冲突与提供的相同键相关联的值到# {@link地图合并(对象、对象、BiFunction)}。

该合并函数有两个参数,第一个参数为当前重复关键之前对应的值,第二个为当前重复关键现在数据的值。

1,重复时采用后面价值的覆盖前面

的值也可以简写成这样:

Map<字符串,String>地图=list.stream ()。收集(

收藏家。toMap(学生::getClassName,学生::getStudentName,

(key1 key2)→key2));

也可以简写成这样:

Map<字符串,String>地图=list.stream ()。收集(

收藏家。toMap(学生::getClassName,学生::getStudentName,

(value1, value2)→{

返回value2;

}));

凯哥这里就使用了第二种方案:

 JDK8stream将转地图列表对象报错. lang。IllegalStateExcep

第二种简单也方便看懂。

最后来个总结吧。

总结:

这几个办法都是基于toMap重载方法第三个参数来实现的!至于哪个方法最好,我觉得应该取决于具体业务!

欢迎大家一起学习一起交流。凯哥Java


JDK8stream将转地图列表对象报错java.lang.IllegalStateExcep