天天看点

Collectors.toMap Duplicate key问题

发现问题:

在开发中,简化代码使用JDK8特性stream流式操作,应用Collectors.toMap方法时,出现Duplicate key问题。
           

代码和异常

实际代码:

Map<String,SecurityGroupResource>securityGroupMap = securityGroupResources.stream()
                    .collect(Collectors.toMap(SecurityGroupResource::getSgid,a->a));             

异常:

Collectors.toMap Duplicate key问题

分析

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;
            }));
           

继续阅读