Ako previesť zoznam na mapu v Jave

1. Prehľad

Prevádza Zoznam do Mapa je bežná úloha. V tomto výučbe sa dozvieme niekoľko spôsobov, ako to dosiahnuť.

Budeme predpokladať, že každý prvok z Zoznam má identifikátor, ktorý sa použije ako kľúč vo výsledku Mapa.

2. Vzorová dátová štruktúra

Najskôr si modelujme prvok:

public class Animal {private int id; súkromné ​​meno reťazca; // constructor / getters / setters}

The id pole je jedinečné, a preto ho môžeme urobiť kľúčovým.

Začnime prevádzať tradičným spôsobom.

3. Pred programom Java 8

Evidentne môžeme previesť a Zoznam do a Mapa pomocou základných metód Java:

verejná mapa convertListBeforeJava8 (zoznam) {Map map = new HashMap (); pre (Zvieracie zviera: zoznam) {map.put (animal.getId (), zviera); } spiatočná mapa; }

Vyskúšajme prevod:

@Test public void whenConvertBeforeJava8_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListBeforeJava8 (list); assertThat (map.values ​​(), containsInAnyOrder (list.toArray ())); }

4. S programom Java 8

Počnúc Java 8 môžeme previesť Zoznam do a Mapa pomocou prúdov a Zberatelia:

 verejná mapa convertListAfterJava8 (zoznam) {Map map = list.stream () .collect (Collectors.toMap (Animal :: getId, animal -> animal)); spiatočná mapa; }

Opäť sa uistite, či je konverzia vykonaná správne:

@Test public void whenConvertAfterJava8_thenReturnMapWithTheSameElements () {Map map = convertListService.convertListAfterJava8 (list); assertThat (map.values ​​(), containsInAnyOrder (list.toArray ())); }

5. Používanie knižnice Guava

Okrem základnej Javy môžeme na konverziu použiť knižnice tretích strán.

5.1. Konfigurácia Maven

Najskôr si do našej musíme pridať nasledujúcu závislosť pom.xml:

 com.google.guava guava 23.6.1-jre 

Najnovšiu verziu tejto knižnice nájdete vždy tu.

5.2. Konverzia s Maps.uniqueIndex ()

Po druhé, použijeme Maps.uniqueIndex () metóda prevodu a Zoznam do a Mapa:

verejná mapa convertListWithGuava (zoznam) {Map map = Maps .uniqueIndex (list, Animal :: getId); spiatočná mapa; }

Nakoniec otestujme konverziu:

@Test public void whenConvertWithGuava_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithGuava (list); assertThat (map.values ​​(), containsInAnyOrder (list.toArray ())); } 

6. Používanie knižnice Apache Commons Library

Môžeme tiež vykonať konverziu smetóda knižnice Apache Commons.

6.1. Konfigurácia Maven

Najskôr zahrňme závislosť Maven:

 org.apache.commons commons-collections4 4.2 

Najnovšia verzia tejto závislosti je k dispozícii tu.

6.2. MapUtils

Po druhé, urobíme prevod pomocou MapUtils.populateMap ():

verejná mapa convertListWithApacheCommons2 (zoznam) {Map map = new HashMap (); MapUtils.populateMap (mapa, zoznam, zviera :: getId); spiatočná mapa; }

Na záver sa uistite, že funguje podľa očakávania:

@Test public void whenConvertWithApacheCommons2_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithApacheCommons2 (zoznam); assertThat (map.values ​​(), containsInAnyOrder (list.toArray ())); }

7. Konflikt hodnôt

Poďme skontrolovať, čo sa stane, ak id pole nie je jedinečné.

7.1. Zoznam z Zvieratá S duplikátom Ids

Najskôr vytvorme a Zoznam z Zvieras s nejedinečným ids:

@ Pred public void init () {this.duplicatedIdList = nový ArrayList (); Zvieracia mačka = nové zviera (1, „Mačka“); duplicatedIdList.add (mačka); Zvierací pes = nové zviera (2, „Pes“); duplicatedIdList.add (pes); Zvieracie prasa = nové zviera (3, "prasa"); duplicatedIdList.add (prasa); Zvieracia krava = nové zviera (4, „Krava“); duplicatedIdList.add (krava); Zvieracia koza = nové zviera (4, „koza“); duplicatedIdList.add (koza); }

Ako je uvedené vyššie, krava a koza mať to isté id.

7.2. Kontrola správania

Java Mapa‘S put () metóda je implementovaná tak, že najnovšia pridaná hodnota prepíše predchádzajúcu rovnakým kľúčom.

Z tohto dôvodu je tradičná konverzia a Apache Commons MapUtils.populateMap () správať sa rovnako:

@Test public void whenConvertBeforeJava8_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListBeforeJava8 (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); } @Test public void whenConvertWithApacheCommons_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListWithApacheCommons (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); }

Ako je zrejmé, koza prepíše krava s tým istým id.

Na rozdiel od toho Collectors.toMap () a MapUtils.populateMap () hodiť IllegalStateException a IllegalArgumentException resp:

@Test (očakáva sa = IllegalStateException.class) public void givenADupIdList_whenConvertAfterJava8_thenException () {convertListService.convertListAfterJava8 (duplicatedIdList); } @Test (očakáva sa = IllegalArgumentException.class) verejné neplatné danéADupIdList_whenConvertWithGuava_thenException () {convertListService.convertListWithGuava (duplicatedIdList); }

8. Záver

V tomto rýchlom článku sme sa venovali rôznym spôsobom prevodu a Zoznam do a Mapa, uvádzanie príkladov s jadrom Java, ako aj s niektorými populárnymi knižnicami tretích strán.

Celý zdrojový kód je ako obvykle k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found