java8 toMap問(wèn)題(key重復(fù)如何解決)
java8 toMap(key重復(fù)解決)
使用stream的toMap()函數(shù)時(shí),當(dāng)key重復(fù),系統(tǒng)會(huì)報(bào)錯(cuò)相同的key不能形成一個(gè)map,那么需要解決這個(gè)問(wèn)題
- 相同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的問(wèn)題,其實(shí)是map的key重復(fù)了,首先查看源碼:

顯而易見(jiàn),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()));
原來(lái)的map中的key就變成了value
map.values().stream().map(BottomAccount::getGoodName).collect(Collectors.toList())
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java接口私有方法實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了java接口私有方法實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Java 策略模式與模板方法模式相關(guān)總結(jié)
這篇文章主要介紹了Java 策略模式與模板方法模式相關(guān)總結(jié),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01
Java對(duì)象數(shù)組的添加、刪除和遍歷代碼示例
在Java編程中,我們經(jīng)常需要對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷操作,并根據(jù)業(yè)務(wù)需求刪除部分元素,這篇文章主要給大家介紹了關(guān)于Java對(duì)象數(shù)組的添加、刪除和遍歷的相關(guān)資料,需要的朋友可以參考下2024-04-04
SpringBoot+netty-socketio實(shí)現(xiàn)服務(wù)器端消息推送
這篇文章主要介紹了SpringBoot+netty-socketio實(shí)現(xiàn)服務(wù)器端消息推送,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
eclipse自動(dòng)創(chuàng)建SpringBoot項(xiàng)目報(bào)錯(cuò)的解決
這篇文章主要介紹了eclipse自動(dòng)創(chuàng)建SpringBoot項(xiàng)目報(bào)錯(cuò)的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java?System#exit無(wú)法退出程序的問(wèn)題及解決
這篇文章主要介紹了Java?System#exit無(wú)法退出程序的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot中的server.context-path的實(shí)現(xiàn)
本文主要介紹了SpringBoot中的server.context-path的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08

