Java8 流处理过程进行toMap规约处理时的java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)异常

一、异常现象和问题描述

在进行将流规约处理为Map时出现冲突导致规约合并失败异常导致流规约异常,异常现象为抛出合并异常,如下:

运行抛出异常:

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 28
    at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
    at java.util.HashMap.merge(HashMap.java:1253)
    at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)

二、代码复现如下:

//员工列表
List<Employee> employList = new ArrayList<Employee>();
//添加员工
employList.add(new Employee(20200401, "Mike", 25));
employList.add(new Employee(20200402, "Mary", 26));
employList.add(new Employee(20200403, "Jack", 28));
employList.add(new Employee(20200404, "Tom", 23));
employList.add(new Employee(20200405, "Lucy", 21));
employList.add(new Employee(20200406, "Jim", 26));
employList.add(new Employee(20200407, "David", 29));
employList.add(new Employee(20200408, "Jack", 22));
		
/**
 * 将员工列表规约处理为姓名和年龄集合,由于员工有重名,符合规约异常问题现象复现
 */
//异常规约处理方式,不进行出现重名时的处理---出现规约冲突异常;
Map<String, Integer> nameAgeIgnoreRepeatMap = employList.stream().collect(Collectors.toMap(Employee :: getName, Employee :: getAge));
//对重名现象进行处理,避免规约冲突;“(v1, v2) -> v1”,当出现冲突时默认取初始出现值;实际中可以根据自己的实际情况取值
Map<String, Integer> nameAgeMap = employList.stream().collect(Collectors.toMap(Employee :: getName, Employee :: getAge, (v1, v2) -> v1));

三、解决方法,规约处理时进行冲突兼容处理,即出现冲突时进行取值选择

冲突处理选择方法,在toMap(key, value, (v1,v2) -> v1)中添加冲突时选值参数“(v1, v2)-> v1”表示出现key冲突时取第一次出现的key的值,,“(v1, v2)-> v2”表示出现key冲突时取最后一次出现的key的值,在实际中根据自己的实际情况取值。使用示例如下所示:
 

//对重名现象进行处理,避免规约冲突;“(v1, v2) -> v1”,当出现冲突时默认取初始出现值;实际中可以根据自己的实际情况取值
Map<String, Integer> nameAgeMap = employList.stream().collect(Collectors.toMap(Employee :: getName, Employee :: getAge, (v1, v2) -> v1));

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值