首页 > 其他分享 >使用Stream进行List转Map踩坑Duplicate key错误

使用Stream进行List转Map踩坑Duplicate key错误

时间:2023-01-12 17:58:24浏览次数:35  
标签:AbstractPipeline Map java Stream stream List util base key

报错代码

myList.stream().collect(Collectors.toMap(MyDto::getCd, MyDto::getNm));

报错信息

java.lang.IllegalStateException: Duplicate key 000001-01-0000000000002-0001-0002 (attempted merging values 2000 and 2000)
at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:135)
at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182)
at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)

正确写法/稳妥写法

myList.stream().collect(Collectors.toMap(MyDto::getCd, MyDto::getNm, (v1, v2) -> v2)));

如果业务上,myList中的MyDto::getCd会拿到重复数据,就会导致Duplicate key错误产生。
所以需要指定重复key的处理规则。
(v1, v2) -> v1 :不覆盖
(v1, v2) -> v2 :直接覆盖旧的key

标签:AbstractPipeline,Map,java,Stream,stream,List,util,base,key
From: https://www.cnblogs.com/vaen/p/17047373.html

相关文章