JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key異常解決(key重複)

測試又報bug啦

接到測試小夥伴的問題,說是一個接口不返回數據了,好吧,雖然不是我寫的接口任務落到頭上也得解決,本地調試了一下,好傢伙,直接拋了個異常出來,這又是哪位大哥喝醉了寫的代碼...java

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 
    at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
    at java.util.HashMap.merge(HashMap.java:1254)
    at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)

key重複異常解決

報錯的那行代碼以下:ide

Map<Long, Entity> entityMap= entityList.stream().collect(Collectors.toMap(Entity::getType, (entity) -> entity));

這行代碼的目的就是將一個list對象轉爲map對象,以type爲key,以entity對象爲value。
可是與日常用的方法不一樣,而是直接使用java8的stream方式,報錯也很清楚,就是key重複,也就是說在使用toMap方法時,有重複的type值致使了這個報錯,最終解決方式以下:測試

Map<Long, Entity> entityMap= entityList.stream().collect(Collectors.toMap(Entity::getType, Function.identity(),(entity1,entity2) -> entity1));

使用toMap()的重載方法,若是已經存在則再也不修改來避免重複key的問題。lua

順便吐槽一下,這已是多久前的代碼了,怎麼今天才報出這個錯,也是醉了。調試

相關文章
相關標籤/搜索