点击上方“Coder编程”,选择“置顶公众号”
技术文章第一时间送达!
最近项目中在使用JDK8中toMap方法遇到因key相同而导致toMap报错的情况。报Duplicate key xxxx异常。
举例
准备以下CityProperty对象集合 ,构造方法CityProperty(String cityCode, String cityname)
List<CityProperty> list = new ArrayList<>();
list.add(new CityProperty("SHQ", "商丘"));
list.add(new CityProperty("CSX", "长沙"));
list.add(new CityProperty("CGQ", "长春"));
list.add(new CityProperty("SHQ", "商丘"));
list.add(new CityProperty("KWE", "贵阳"));
当进行普通toMap操作时
Map<Long, String> map = list.stream()
.collect(Collectors.toMap(CityProperty::getCityCode, CityProperty::getCityName);
抛出异常
方法
Collectors.toMap(keyMapper, valueMapper, mergeFunction)
解决方案
方案一
第一个参数是要生成map的key,第二个参数是新生成map的value,第三个参数是当key发生重复时处理的方法,重复时需要返回一个数值放到当前value处。
出现重复时,取前面value的值,或者取后面放入的value值,则覆盖先前的value值
list.stream().collect(Collectors.toMap(CityProperty::getCityCode, CityProperty::getCityName,
(value1, value2 )->{
return value1;
}));
list.stream().collect(Collectors.toMap(CityProperty::getCityCode, CityProperty::getCityName,
(value1, value2 )->{
return value2;
}));
方案二
重复时将之前的value 和现在的value拼接或相加起来
list.stream().collect(Collectors.toMap(CityProperty::getCityCode, CityProperty::getCityName,
(key1 , key2)-> key1 + "," + key2 ));
方案三
将重复的value编程一个集合
Map<String, List<String>> map = list.stream().collect(Collectors.toMap(CityProperty :: getCityCode,
// 此时的value 为集合,方便重复时操作
s -> {
List<String> list = new ArrayList<>();
list.add(s.getCityName());
return list;
},
// 重复时将现在的值全部加入到之前的值内
(List<String> value1, List<String> value2) -> {
value1.addAll(value2);
return value1;
}
));
推荐
文末
欢迎关注个人微信公众号:Coder编程
欢迎关注Coder编程公众号,主要分享数据结构与算法、Java相关知识体系、框架知识及原理、Spring全家桶、微服务项目实战、DevOps实践之路、每日一篇互联网大厂面试或笔试题以及PMP项目管理知识等。更多精彩内容正在路上~
新建了一个qq群:315211365,欢迎大家进群交流一起学习。谢谢了!也可以介绍给身边有需要的朋友。文章收录至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
欢迎关注并star~微信公众号
我知道你 “在看”