如何在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。檢查行為

實現JavaMapput()方法,以便最新的附加值用相同的鍵覆蓋前一個

**

囙此,傳統的轉換和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上,