JDK8有很多新特性,比如λ表达式,函数式编程以及流流的使用,这几个新特性,使用过之后就爱不释手了,比如将列表集合通过流可以直接转换成地图对象。
语法:
地图地图=list.stream.stream () .collect (Collectors.toMap(列表集合中对象::得到属性,列表对象别名→列表对象别名));
示例:
Map<整数,EmployeeTeacherCertificate>employeeTeacherCertificateMap=employeeTeacherCertificates.stream () .collect (Collectors.toMap (EmployeeTeacherCertificate:: getEmployeeId, cert→cert));
说明:
employeeTeacherCertificates列表集合对象
EmployeeTeacherCertificate:是列表中的集合对象
是不是很简单。
但是,如果列表中比如说empId有重复的话,就会报错。如下:
错误信息说,employeeId=4429的值在集合中有重复的。
这个时候怎么解决呢?
我们可以使用toMap的另一个重载方法。带有去重的方法。
语法:
收藏家。toMap (keyMapper valueMapper mergeFunction)
源码:
参数说明:
前两个参数都是与之前一样键和值得取值属性,第三个参数是当关键发生重复时处理的方法,注释上的解释如下:
简单一句话:
一种合并函数,用于解决两者之间的冲突与提供的相同键相关联的值到# {@link地图合并(对象、对象、BiFunction)}。
该合并函数有两个参数,第一个参数为当前重复关键之前对应的值,第二个为当前重复关键现在数据的值。
1,重复时采用后面价值的覆盖前面
的值也可以简写成这样:
Map<字符串,String>地图=list.stream ()。收集(
收藏家。toMap(学生::getClassName,学生::getStudentName,
(key1 key2)→key2));
也可以简写成这样:
Map<字符串,String>地图=list.stream ()。收集(
收藏家。toMap(学生::getClassName,学生::getStudentName,
(value1, value2)→{
返回value2;
}));
凯哥这里就使用了第二种方案:
第二种简单也方便看懂。
最后来个总结吧。
总结:
这几个办法都是基于toMap重载方法第三个参数来实现的!至于哪个方法最好,我觉得应该取决于具体业务!
欢迎大家一起学习一起交流。凯哥Java