java8 toMap問題(key重復(fù)如何解決)
java8 toMap(key重復(fù)解決)
使用stream的toMap()函數(shù)時(shí),當(dāng)key重復(fù),系統(tǒng)會(huì)報(bào)錯(cuò)相同的key不能形成一個(gè)map,那么需要解決這個(gè)問題
- 相同key的情況下,丟棄重復(fù)的只保留一個(gè)
- 相同key的情況下,把value變成list,形成Map(Object,List<Object>)的形式
1.當(dāng)key重復(fù),使用最后一個(gè)value為值
2.當(dāng)key重復(fù),使用list收集
Collectors.toMap的key重復(fù)
Map<String, BottomAccount> map = bottomAccountList.stream().collect(Collectors.toMap(BottomAccount::getGoodName, Function.identity()));
如這個(gè)地方,如果使用GoodName為map的key,貨物名稱有可能會(huì)重復(fù),這時(shí)候就會(huì)報(bào)Duplicate Key的問題,其實(shí)是map的key重復(fù)了,首先查看源碼:
顯而易見,throwingMerger()是一個(gè)出現(xiàn)異常時(shí)默認(rèn)執(zhí)行的方法,可以看到,入?yún)⑹荋ashMap,大膽猜測(cè)、小心求證,我們猜最終是由HashMap去執(zhí)行的Merger方法,
看HashMap里的一段代碼:
這就能證明當(dāng)出現(xiàn)map的key重復(fù)時(shí)會(huì)報(bào)錯(cuò)Duplicate Key的異常了。
如果不想拋異常,自己給傳一個(gè)新的key值用于替換原有值。
所以,
解決方案一
給重復(fù)的Key設(shè)置一個(gè)新的值
Map<Integer, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(oldValue, newValue) -> newValue));
但是考慮到實(shí)際業(yè)務(wù)中,給重復(fù)的key設(shè)置一個(gè)新的值并不符合需求,所以,
解決方案二
使用其他字段為map的key,如主鍵id
Map<String, BottomAccount> map = bottomAccountList.stream().collect(Collectors.toMap(BottomAccount::getId, Function.identity()));
原來的map中的key就變成了value
map.values().stream().map(BottomAccount::getGoodName).collect(Collectors.toList())
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 正則表達(dá)式入門詳解(基礎(chǔ)進(jìn)階)
最近看到很多同學(xué)想要學(xué)習(xí)java正則表達(dá)式的一些知識(shí),那么腳本之家小編就為大家介紹一下,其實(shí)正則表達(dá)式實(shí)用性很強(qiáng),處理大幅文字的時(shí)候都需要用得到,語法也大同小異2017-10-10如何在?Spring?Boot?中使用?OpenAI?ChatGPT?API
這篇文章主要介紹了如何在Spring?Boot中使用OpenAI?ChatGPT?API,我們探索了 OpenAI ChatGPT API 以生成對(duì)提示的響應(yīng),我們創(chuàng)建了一個(gè) Spring Boot 應(yīng)用程序,它調(diào)用 API 來生成對(duì)提示的響應(yīng),需要的朋友可以參考下2023-08-08詳解如何在springcloud分布式系統(tǒng)中實(shí)現(xiàn)分布式鎖
最近在看分布式鎖的資料,本文就介紹一下利用springcloud結(jié)合redis實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11SpringCloud Alibaba Nacos 整合SpringBoot A
這篇文章主要介紹了SpringCloud Alibaba Nacos 整合SpringBoot Admin實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12常用校驗(yàn)注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明
這篇文章主要介紹了常用校驗(yàn)注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01spring為類的靜態(tài)屬性實(shí)現(xiàn)注入實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于spring為類的靜態(tài)屬性實(shí)現(xiàn)注入實(shí)例方法,有需要的朋友們可以參考下。2019-10-10Java設(shè)計(jì)模式中的七大原則詳細(xì)講解
本篇文章主要對(duì)Java中的設(shè)計(jì)模式如,創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式以及7大原則進(jìn)行了歸納整理,需要的朋友可以參考下,希望能給你帶來幫助2023-02-02java 中函數(shù)的參數(shù)傳遞詳細(xì)介紹
這篇文章主要介紹了 java 中函數(shù)的參數(shù)傳遞詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11