如何在Java中實現清單到映射的轉換
1。概述
將清單轉換為映射是一項常見的任務。在本教程中,我們將介紹幾種方法
*
我們假設清單中的每個元素都有一個識別字,該識別字將用作生成的映射中的鍵**
**
進一步閱讀:
將清單轉換為具有自定義供應商的映射
學習使用自定義供應商將清單轉換為映射的幾種方法。
閱讀更多→
在Java中將清單轉換為字串
學習如何使用不同的科技將清單轉換為字串。
閱讀更多→
Java中清單與集合之間的轉換
如何使用普通Java、Guava或apachecommons集合在清單和集合之間進行轉換。
閱讀更多→
2。示例資料結構
首先,讓我們對元素建模:
公共類動物{
私有內部id;
私有字串名稱;
//搆造函數/getter/setters
}
id欄位是唯一的,囙此我們可以將其設為鍵
讓我們開始用傳統管道轉換
3。Java 8之前
顯然,我們可以使用覈心Java方法將清單轉換為映射:
*
公共地圖<;Integer,Animal>;convertListBeforeJava8(清單<;Animal>;清單){
Map<;Integer,Animal>;Map=new HashMap<;();
for(動物動物:清單){
地圖.put(動物.getId(),動物);
}
返回圖;
}
讓我們測試一下轉換:
4。使用Java 8
使用em-Map我們可以使用em-Map啟動em-Map**
公共地圖<;Integer,Animal>;convertListAfterJava8(清單<;Animal>;List){
地圖<;整數,動物>;地圖=清單.stream()
.收集(收集器.toMap(動物::getId,Animal->;Animal));
返回圖;
}
同樣,讓我們確保轉換正確完成:
5。使用Guava庫
除了覈心Java,我們可以使用協力廠商庫進行轉換
5.1。Maven配寘
首先,我們需要將以下依賴項添加到我們的pom.xml檔案:
<;依賴關係>;
<;組ID>;com.google.guava<;/groupId>;
<;artifactId>;芭樂<;/artifactId>;
<;version>;23.6.1-jre<;/version>;
<;/dependency>;
始終可以找到此庫的最新版本這裡
5.2。使用轉換地圖.唯一索引()
其次,讓我們使用地圖.唯一索引()將清單轉換為映射的方法:
公共地圖<;Integer,Animal>;convertListWithGuava(清單<;Animal>;List){
Map<;Integer,Animal>;Map=地圖
.uniqueIndex(list,Animal::getId);
返回圖;
}
最後,讓我們測試轉換:
6。使用Apache Commons庫
我們還可以使用apachecommons庫的方法進行轉換
*
6.1。Maven配寘
首先,讓我們包括Maven依賴:
<;依賴關係>;
<;組ID>;org.apache.commons<;/groupId>;
<;artifactId>;commons-collections4<;/artifactId>;
<;版本>;4.2<;/version>;
<;/dependency>;
此依賴項的最新版本可用在這裡
6.2.映射工具
**
其次,我們將使用MapUtils.populateMap():
公共地圖<;Integer,Animal>;convertListWithApacheCommons2(清單<;Animal>;List){
Map<;Integer,Animal>;Map=new HashMap<;();
MapUtils.populateMap(地圖,清單,動物::getId);
返回圖;
}
最後,讓我們確保它按預期工作:
7。價值觀衝突
讓我們檢查一下如果id欄位不唯一會發生什麼
7.1。列出帶有重複的Ids的動物**
首先,讓我們創建一個帶有非唯一id的動物的清單*:*
*課前 公共void init(){ 這個重複的清單=新ArrayList<;>;(); 動物猫=新動物(1,“猫”); 重複添加(猫); 動物狗=新動物(2,“狗”); 重複添加(狗); 動物猪=新動物(3,“猪”); 重複添加(猪); Animal cow=新動物(4,“cow”); 重複添加(奶牛); 動物山羊=新動物(4,“山羊”); 重複添加(山羊); }
如上所示,母牛和山羊的id相同
7.2。檢查行為
實現JavaMap的put()方法,以便最新的附加值用相同的鍵覆蓋前一個
**
囙此,傳統的轉換和Apache CommonsMapUtils.populateMap()行為管道相同:
可以看出,山羊用相同的id覆蓋奶牛
與此不同的是,*收集器.toMap()和MapUtils.populateMap()分別拋出IllegalStateException**和IllegalArgumentException***:**
**
@Test(預期=I异常.statelleglass)
public void givenADupIdList\u when convert afterjava8\u thenException(){
convertListService.convertListAfterJava8(複製清單);
}
@Ille=預期測試galArgumentException.class)
當用芭樂轉換時,公共無效givenADupIdList\u thenException(){
convertListService.convertListWithGuava(複製清單);
}
8。結論
在這篇快速文章中,我們介紹了將清單轉換為映射的各種方法,並給出了覈心Java和一些流行的協力廠商庫的示例**
**
與往常一樣,完整的原始程式碼是可用的在GitHub上,