发现问题:
在开发中,简化代码使用JDK8特性stream流式操作,应用Collectors.toMap方法时,出现Duplicate key问题。
代码和异常
实际代码:
Map<String,SecurityGroupResource>securityGroupMap = securityGroupResources.stream()
.collect(Collectors.toMap(SecurityGroupResource::getSgid,a->a));
异常:
分析
Duplicate key 重复key。我们知道,map里key是唯一的。此时toMap方法不清楚取前值还是后值,故抛出异常。
解决方法
1、保证list转map时,key唯一(不推荐,代码问题不要用业务去保证唯一)
2、给toMap方法确定覆盖还是不覆盖。
覆盖(取后值):
Map<String,SecurityGroupResource> securityGroupMap = securityGroupResources.stream()
.collect(Collectors.toMap(SecurityGroupResource::getSgid,a->a,(V1,V2)->V1)));
不覆盖(留前值):
Map<String,SecurityGroupResource> securityGroupMap = securityGroupResources.stream()
.collect(Collectors.toMap(SecurityGroupResource::getSgid,a->a,(V1,V2)->V2)));
3、业务场景如果相同key的值要全部保存,就用Map>去解决。
先遍历集合
securityGroupResources.stream().collect(Collectors.toMap(SecurityGroupResource::getSgid,
a -> Arrays.asList(a),
(List<String> oldList, List<String> newList) -> {
oldList.addAll(newList);
return oldList;
}));