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.