欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java8 toMap問題(key重復(fù)如何解決)

 更新時間:2022年05月06日 10:01:02   作者:爪哇c  
這篇文章主要介紹了java8 toMap問題(key重復(fù)如何解決),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java8 toMap(key重復(fù)解決)

使用stream的toMap()函數(shù)時,當(dāng)key重復(fù),系統(tǒng)會報錯相同的key不能形成一個map,那么需要解決這個問題

  • 相同key的情況下,丟棄重復(fù)的只保留一個
  • 相同key的情況下,把value變成list,形成Map(Object,List<Object>)的形式

1.當(dāng)key重復(fù),使用最后一個value為值

2.當(dāng)key重復(fù),使用list收集

Collectors.toMap的key重復(fù)

Map<String, BottomAccount> map = bottomAccountList.stream().collect(Collectors.toMap(BottomAccount::getGoodName, Function.identity()));

如這個地方,如果使用GoodName為map的key,貨物名稱有可能會重復(fù),這時候就會報Duplicate Key的問題,其實是map的key重復(fù)了,首先查看源碼:

1.png

顯而易見,throwingMerger()是一個出現(xiàn)異常時默認執(zhí)行的方法,可以看到,入?yún)⑹荋ashMap,大膽猜測、小心求證,我們猜最終是由HashMap去執(zhí)行的Merger方法,

2.png

看HashMap里的一段代碼:

3.png

這就能證明當(dāng)出現(xiàn)map的key重復(fù)時會報錯Duplicate Key的異常了。

如果不想拋異常,自己給傳一個新的key值用于替換原有值。

所以,

解決方案一

給重復(fù)的Key設(shè)置一個新的值

Map<Integer, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName,(oldValue, newValue) -> newValue));

但是考慮到實際業(yè)務(wù)中,給重復(fù)的key設(shè)置一個新的值并不符合需求,所以,

解決方案二

使用其他字段為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())

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關(guān)文章

最新評論