
文章插图
?
JDK8有很多新特性 , 比如lambda表达式 , 函数式编程以及stream流的使用 , 这几个新特性 , 使用过之后就爱不释手了 , 比如将list集合通过stream可以直接转换成map对象 。
语法:
Map map = list.stream.stream().collect(Collectors.toMap(list集合中对象::get属性 , list对象别名->list对象别名));
示例:
Map<Integer , EmployeeTeacherCertificate> employeeTeacherCertificateMap =employeeTeacherCertificates.stream().collect(Collectors.toMap(EmployeeTeacherCertificate::getEmployeeId,cert->cert));
说明:
employeeTeacherCertificates List集合对象
EmployeeTeacherCertificate:是List中的集合对象
是不是很简单 。
但是 , 如果list中比如说empId有重复的话 , 就会报错 。如下:

文章插图
?
错误信息说 , employeeId=4429的值在集合中有重复的 。
这个时候怎么解决呢?
我们可以使用toMap的另一个重载方法 。带有去重的方法 。
语法:
Collectors.toMap(keyMApper, valueMapper, mergeFunction)
源码:

文章插图
?
参数说明:
前两个参数都是与之前一样 key 和 value得取值属性 , 第三个参数是当key 发生重复时处理的方法 , 注释上的解释如下:

文章插图
?
简单一句话:
一种合并函数 , 用于解决两者之间的冲突与提供的相同键相关联的值到{@link Map#merge(Object, Object, BiFunction)} 。
该合并函数有两个参数 , 第一个参数为当前重复key 之前对应的值 , 第二个为当前重复key 现在数据的值 。
1、重复时采用后面的value 覆盖前面的value
也可以简写成这样:
Map<String, String> map = list.stream().collect(
Collectors.toMap(Student :: getClassName, Student :: getStudentName,
(key1 , key2)-> key2 ));
也可以简写成这样:
【JDK8stream将list转Map对象报错java.lang.IllegalStateException】Map<String, String> map = list.stream().collect(
Collectors.toMap(Student :: getClassName, Student :: getStudentName,
(value1, value2 )->{
return value2;
}));
凯哥这里就使用了第二种方案:

文章插图
?
第二种简单也方便看懂 。
最后来个总结吧 。
总结:
这几个办法都是基于toMap重载方法第三个参数来实现的!至于哪个方法最好 , 我觉得应该取决于具体业务!
欢迎大家一起学习一起交流 。凯哥JAVA
推荐阅读
- 嵊州越乡龙井即将迈上新台阶
- 安溪浓香型铁观音茶王赛将于31日正式开赛
- 绝杀|回家钓鱼了!5-4浪费赛点,5-6惨遭绝杀,中国业余小将告别世锦赛
- 宁波国际茶文化节5月将启幕 诚征三口之家赏茶
- 薮北茶融入宜兴元素将成茶业发展新亮点
- 西方历史上的4位天才将领 西方四大名将
- 春分后各茶品将陆续生产 不同的你喝不同的茶
- 勐海,老班章村民卖茶将实现刷卡交易
- 吴裕泰将办写茶 画茶 炒茶 说茶系列活动
- 洞庭春三年内将建10万亩黄茶示范基地
