JDK8stream将list转Map对象报错java.lang.IllegalStateExcep

0cicg9AFzaC

JDK8有不少新特性,好比lambda表达式,函数式编程以及stream流的使用,这几个新特性,使用过以后就爱不释手了,好比将list集合经过stream能够直接转换成map对象。编程

语法:app

Map map = list.stream.stream().collect(Collectors.toMap(list集合中对象::get属性,list对象别名->list对象别名));ide

示例:函数式编程

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

说明:学习

employeeTeacherCertificates List集合对象url

EmployeeTeacherCertificate:是List中的集合对象spa

是否是很简单。3d

可是,若是list中好比说empId有重复的话,就会报错。以下:orm

0cicgbKFzrE

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

这个时候怎么解决呢?

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

语法:

Collectors.toMap(keyMapper, valueMapper, mergeFunction)

源码:

0cicglQYzZY

参数说明:

前两个参数都是与以前同样 key 和 value得取值属性, 第三个参数是当key 发生重复时处理的方法,注释上的解释以下:

0cicgXXmh6m

简单一句话:

一种合并函数,用于解决二者之间的冲突与提供的相同键相关联的值到{@link Map#merge(Object, Object, BiFunction)}。

该合并函数有两个参数,第一个参数为当前重复key 以前对应的值,第二个为当前重复key 如今数据的值。

一、重复时采用后面的value 覆盖前面的value

也能够简写成这样:

Map<String, String> map = list.stream().collect(

Collectors.toMap(Student :: getClassName, Student :: getStudentName,

(key1 , key2)-> key2 ));

也能够简写成这样:

Map<String, String> map = list.stream().collect(

Collectors.toMap(Student :: getClassName, Student :: getStudentName,

(value1, value2 )->{

return value2;

}));

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

0cicgLapQv2

第二种简单也方便看懂。

最后来个总结吧。

总结:

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

欢迎你们一块儿学习一块儿交流。凯哥Java

相关文章
相关标签/搜索