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


測試又報bug啦

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

	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重復異常解決

報錯的那行代碼如下:

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的問題。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM