当前位置: 代码迷 >> 综合 >> Java8 Stream,List转Map遇到key冲突问题-java.lang.IllegalStateException: Duplicate key
  详细解决方案

Java8 Stream,List转Map遇到key冲突问题-java.lang.IllegalStateException: Duplicate key

热度:69   发布时间:2024-01-24 21:50:47.0

在使用Stream把List转化为Map的时候,抛出了java.lang.IllegalStateException: Duplicate key异常,原因在于生成Map的key出现冲突。

查看如下代码:

当我们根据猫的名字创建名称Map的时候,发现有2个相同的cat2,导致了产生IllegalStateException异常

package com.bytrees.test;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;import org.junit.Assert;
import org.junit.Test;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;public class StreamMapUniqTest {@Testpublic void uniqTest() {List<Cat> catList = new ArrayList<>();catList.add(new Cat(1, "cat1"));catList.add(new Cat(2, "cat2"));catList.add(new Cat(3, "cat2"));Map<String, Cat> catMap2 = catList.stream().collect(Collectors.toMap(Cat::getName, val -> val));Assert.assertTrue(catMap2.size() == 2);}@Getter@Setter@AllArgsConstructorclass Cat {private Integer id;private String name;}
}

如何解决问题?

这里是没有统一的方案,生成Map尽量使用唯一键,比如数据库主键ID等。

1)使用旧值,或者覆盖新值

Map<String, Cat> catMap2 = catList.stream().collect(Collectors.toMap(Cat::getName, val -> val, (v1, v2) -> v1));

如果要用新覆盖旧值,改成(v1, v2) -> v2即可

2)如果确实存在多个值,建议调整你的数据结构,比如Map<String, List<Cat>>