在我們平時的工作中,充滿了各種類型之間的轉換。今天小編帶大家上手 List 轉 Map 的各種操作。
我們將假設 List 中的每個元素都有一個標識符,該標識符將在生成的 Map 中作為一個鍵使用。
定義一個類型
我們在轉換之前,我們先暫定一個類來用于各種轉換demo的演示。
public class Animal {
private int id;
private String name;
// 構造函數 、 get 、 set
}
我們假定 id 字段 是唯一的, 所以我們把 id 作為 Map 的key。
使用 Java 8 之前的方法
在使用Java 8 之前,就只能使用比較傳統的for 循環來轉換。
public Map< Integer, Animal > convertListBeforeJava8(List< Animal > list) {
Map< Integer, Animal > map = new HashMap< >();
for (Animal animal : list) {
map.put(animal.getId(), animal);
}
return map;
}
我們需要寫一個測試代碼,測試下是否正常運行了。
@Test
public void testConvertListBeforeJava8() {
Map< Integer, Animal > map = convertListService
.convertListBeforeJava8(list);
assertThat(
map.values(),
containsInAnyOrder(list.toArray()));
}
使用Java 8 stream
在Java 8 之后,我們可以通過新增的 Stream API 來進行轉換操作
public Map< Integer, Animal > convertListAfterJava8(List< Animal > list) {
Map< Integer, Animal > map = list.stream()
.collect(Collectors.toMap(Animal::getId, Function.identity()));
return map;
}
測試代碼
@Test
public void testConvertListAfterJava8() {
Map< Integer, Animal > map = convertListService.convertListAfterJava8(list);
assertThat(
map.values(),
containsInAnyOrder(list.toArray()));
}
使用Guava庫
除了使用核心的Java API ,我們還能通過第三方庫來實現這些操作。
使用Guava 庫, 我們需要先引入依賴, 我們先在maven 中引入進來。
< !-- https://mvnrepository.com/artifact/com.google.guava/guava -- >
< dependency >
< groupId >com.google.guava< /groupId >
< artifactId >guava< /artifactId >
< version >31.0.1-jre< /version >
< /dependency >
接下來使用 Maps.uniqueIndex() 進行轉換
public Map< Integer, Animal > convertListWithGuava(List< Animal > list) {
Map< Integer, Animal > map = Maps
.uniqueIndex(list, Animal::getId);
return map;
}
測試代碼
@Test
public void testConvertListWithGuava() {
Map< Integer, Animal > map = convertListService
.convertListWithGuava(list);
assertThat(
map.values(),
containsInAnyOrder(list.toArray()));
}
使用 Apache Commons 庫
除了 Guava ,我們還可以使用常用的 Apache Commons 庫來進行轉換。
我們現在Maven 中引入 commons 的依賴庫
< !-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -- >
< dependency >
< groupId >org.apache.commons< /groupId >
< artifactId >commons-collections4< /artifactId >
< version >4.4< /version >
< /dependency >
接下來我們使用 MapUtils.populateMap() 方法進行轉換。
public Map< Integer, Animal > convertListWithApacheCommons2(List< Animal > list) {
Map< Integer, Animal > map = new HashMap< >();
MapUtils.populateMap(map, list, Animal::getId);
return map;
}
測試代碼
@Test
public void testConvertListWithApacheCommons2() {
Map< Integer, Animal > map = convertListService
.convertListWithApacheCommons2(list);
assertThat(
map.values(),
containsInAnyOrder(list.toArray()));
}
Map Key 的沖突問題
由于List中可以存在多個相同的實例, 但是map卻不行, 那我們來看看Map要怎么處理呢?
首先,我們初始化一個有重復對象的 List
@Before
public void init() {
this.duplicatedIdList = new ArrayList< >();
Animal cat = new Animal(1, "Cat");
duplicatedIdList.add(cat);
Animal dog = new Animal(2, "Dog");
duplicatedIdList.add(dog);
Animal pig = new Animal(3, "Pig");
duplicatedIdList.add(pig);
Animal cow = new Animal(4, "牛");
duplicatedIdList.add(cow);
Animal goat= new Animal(4, "羊");
duplicatedIdList.add(goat);
}
從代碼中可以看到, 牛 和 羊 對象的id 都是 4 。
Apache Commons 和 Java 8 之前的代碼是一樣的,相同id的Map 在put 的時候會進行覆蓋。
@Test
public void testConvertBeforeJava8() {
Map< Integer, Animal > map = convertListService
.convertListBeforeJava8(duplicatedIdList);
assertThat(map.values(), hasSize(4));
assertThat(map.values(), hasItem(duplicatedIdList.get(4)));
}
@Test
public void testConvertWithApacheCommons() {
Map< Integer, Animal > map = convertListService
.convertListWithApacheCommons(duplicatedIdList);
assertThat(map.values(), hasSize(4));
assertThat(map.values(), hasItem(duplicatedIdList.get(4)));
}
而 Java 8 的 Collectors.toMap() 和 Guava 的 MapUtils.populateMap() 分別拋出 IllegalStateException 和 IllegalArgumentException。
@Test(expected = IllegalStateException.class)
public void testGivenADupIdListConvertAfterJava8() {
convertListService.convertListAfterJava8(duplicatedIdList);
}
@Test(expected = IllegalArgumentException.class)
public void testGivenADupIdListConvertWithGuava() {
convertListService.convertListWithGuava(duplicatedIdList);
}
總結
在這篇文章中,指北君給大家分享了各種List 轉 Map 的方法, 給出了使用 Java 原生API 以及一些流行的第三方庫的例子。
-
函數
+關注
關注
3文章
4327瀏覽量
62569 -
代碼
+關注
關注
30文章
4779瀏覽量
68521 -
MAP
+關注
關注
0文章
49瀏覽量
15137
發布評論請先 登錄
相關推薦
評論