Kako pretvoriti popis u mapu na Javi

1. Pregled

Pretvaranje Popis do Karta je uobičajeni zadatak. U ovom ćemo uputstvu pokriti nekoliko načina kako to učiniti.

Pretpostavit ćemo da svaki element Popis ima identifikator koji će se koristiti kao ključ u rezultirajućem Karta.

2. Uzorak strukture podataka

Prvo, modelirajmo element:

javna klasa Animal {private int id; privatni naziv niza; // konstruktor / getters / setters}

The iskaznica polje je jedinstveno, stoga ga možemo učiniti ključnim.

Krenimo s pretvaranjem na tradicionalan način.

3. Prije Jave 8

Očito možemo pretvoriti a Popis do a Karta koristeći osnovne Java metode:

javna karta convertListBeforeJava8 (popis popisa) {Map map = new HashMap (); za (Životinjska životinja: popis) {map.put (animal.getId (), životinja); } karta povratka; }

Isprobajmo pretvorbu:

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

4. S Javom 8

Počevši od Jave 8 možemo pretvoriti a Popis u a Karta pomoću potoka i Kolekcionari:

 javna karta convertListAfterJava8 (popis popisa) {Map map = list.stream () .collect (Collectors.toMap (Animal :: getId, animal -> animal)); karta povratka; }

Ponovno, provjerimo je li konverzija ispravno izvedena:

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

5. Korištenje knjižnice Guava

Osim jezgre Java, za pretvorbu možemo koristiti biblioteke trećih strana.

5.1. Maven konfiguracija

Prvo, moramo dodati sljedeću ovisnost o našoj pom.xml:

 com.google.guava guava 23.6.1-jre 

Najnoviju verziju ove knjižnice uvijek možete pronaći ovdje.

5.2. Pretvorba sa Maps.uniqueIndex ()

Drugo, poslužimo se Maps.uniqueIndex () metoda za pretvorbu a Popis u a Karta:

javna karta convertListWithGuava (popis popisa) {Map map = Maps .uniqueIndex (list, Animal :: getId); karta povratka; }

Na kraju, testirajmo pretvorbu:

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

6. Korištenje Apache Commons Library

Konverziju također možemo izvršiti pomoćumetoda biblioteke Apache Commons.

6.1. Maven konfiguracija

Prvo, uključimo ovisnost o Mavenu:

 org.apache.commons commons-collection4 4.2 

Najnovija verzija ove ovisnosti dostupna je ovdje.

6.2. MapUtils

Drugo, pretvorbu ćemo izvršiti pomoću MapUtils.populateMap ():

javna karta convertListWithApacheCommons2 (popis popisa) {Map map = new HashMap (); MapUtils.populateMap (karta, popis, Animal :: getId); karta povratka; }

Na kraju, pobrinimo se da radi kako se očekuje:

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

7. Sukob vrijednosti

Provjerimo što se događa ako iskaznica polje nije jedinstveno.

7.1. Popis od Životinje S dupliciranim Iskaznicas

Prvo, stvorimo a Popis od Životinjas s nejedinstvenim iskaznicas:

@Before public void init () {this.duplicatedIdList = new ArrayList (); Životinjska mačka = nova Životinja (1, "Mačka"); duplicatedIdList.add (mačka); Životinjski pas = nova Životinja (2, "Pas"); duplicatedIdList.add (pas); Životinjska svinja = nova Životinja (3, "Svinja"); duplicatedIdList.add (svinja); Životinjska krava = nova životinja (4, "Krava"); duplicatedIdList.add (krava); Životinjska koza = nova Životinja (4, "Koza"); duplicatedIdList.add (jarac); }

Kao što je gore prikazano, krava i Jarac imaju isto iskaznica.

7.2. Provjera ponašanja

Java Karta‘S staviti() metoda je implementirana tako da najnovija dodana vrijednost prepisuje prethodnu istim ključem.

Iz tog razloga, tradicionalna pretvorba i Apache Commons MapUtils.populateMap () ponašati se na isti način:

@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))); }

Kao što se može vidjeti, Jarac prepisuje krava s istim iskaznica.

Za razliku od toga, Collectors.toMap () i MapUtils.populateMap () bacanje IllegalStateException i IlegalArgumentException odnosno:

@Test (očekuje se = IllegalStateException.class) javna praznina givenADupIdList_whenConvertAfterJava8_thenException () {convertListService.convertListAfterJava8 (duplicatedIdList); } @Test (očekuje se = IllegalArgumentException.class) javna praznina danaADupIdList_whenConvertWithGuava_thenException () {convertListService.convertListWithGuava (duplicatedIdList); }

8. Zaključak

U ovom smo kratkom članku pokrili razne načine pretvaranja a Popis do a Karta, dajući primjere s jezgrom Java, kao i neke popularne biblioteke trećih strana.

Kao i obično, cjeloviti izvorni kod dostupan je na GitHubu.