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.