在使用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>>