Hvordan konvertere liste til kart i Java

1. Oversikt

Konvertering Liste til Kart er en vanlig oppgave. I denne opplæringen vil vi dekke flere måter å gjøre dette på.

Vi antar at hvert element i Liste har en identifikator som vil bli brukt som en nøkkel i det resulterende Kart.

2. Eksempel på datastruktur

For det første, la oss modellere elementet:

offentlig klasse Animal {private int id; privat strengnavn; // konstruktør / getters / setters}

De id feltet er unikt, derfor kan vi gjøre det til nøkkelen.

La oss begynne å konvertere på den tradisjonelle måten.

3. Før Java 8

Åpenbart kan vi konvertere en Liste til en Kart ved hjelp av kjerne Java-metoder:

public Map convertListBeforeJava8 (List list) {Map map = new HashMap (); for (Animal animal: list) {map.put (animal.getId (), animal); } retur kart; }

La oss teste konverteringen:

@Test offentlig ugyldig nårConvertBeforeJava8_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListBeforeJava8 (list); assertThat (map.values ​​(), inneholderInAnyOrder (list.toArray ())); }

4. Med Java 8

Fra og med Java 8 kan vi konvertere en Liste inn i en Kart ved hjelp av strømmer og Samlere:

 public Map convertListAfterJava8 (List list) {Map map = list.stream () .collect (Collectors.toMap (Animal :: getId, animal -> animal)); retur kart; }

Igjen, la oss sørge for at konverteringen gjøres riktig:

@Test offentlig ugyldig nårConvertAfterJava8_thenReturnMapWithTheSameElements () {Map map = convertListService.convertListAfterJava8 (list); assertThat (map.values ​​(), inneholderInAnyOrder (list.toArray ())); }

5. Bruke Guava-biblioteket

I tillegg til kjernen i Java, kan vi bruke tredjepartsbiblioteker for konverteringen.

5.1. Maven-konfigurasjon

For det første må vi legge til følgende avhengighet til vår pom.xml:

 com.google.guava guava 23.6.1-jre 

Den siste versjonen av dette biblioteket finner du alltid her.

5.2. Konvertering med Maps.uniqueIndex ()

For det andre, la oss bruke Maps.uniqueIndex () metode for å konvertere en Liste inn i en Kart:

public Map convertListWithGuava (List list) {Map map = Maps .uniqueIndex (list, Animal :: getId); retur kart; }

Til slutt, la oss teste konverteringen:

@Test offentlig ugyldig nårConvertWithGuava_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithGuava (list); assertThat (map.values ​​(), inneholderInAnyOrder (list.toArray ())); } 

6. Bruke Apache Commons Library

Vi kan også gjøre en konvertering medmetode for Apache Commons bibliotek.

6.1. Maven-konfigurasjon

For det første, la oss inkludere Maven-avhengighet:

 org.apache.commons commons-collection4 4.2 

Den siste versjonen av denne avhengigheten er tilgjengelig her.

6.2. MapUtils

For det andre vil vi konvertere ved hjelp av MapUtils.populateMap ():

public Map convertListWithApacheCommons2 (List list) {Map map = new HashMap (); MapUtils.populateMap (kart, liste, dyr :: getId); retur kart; }

Til slutt, la oss sørge for at det fungerer som forventet:

@Test offentlig ugyldig nårConvertWithApacheCommons2_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithApacheCommons2 (list); assertThat (map.values ​​(), inneholderInAnyOrder (list.toArray ())); }

7. Verdikonflikt

La oss sjekke hva som skjer hvis id feltet er ikke unikt.

7.1. Liste av Dyr Med duplisert Ids

For det første, la oss lage en Liste av Dyrs med ikke-unike ids:

@Før offentlig ugyldig init () {this.duplicatedIdList = ny ArrayList (); Animal cat = new Animal (1, "Cat"); duplicatedIdList.add (cat); Dyrehund = nytt dyr (2, "Hund"); duplicatedIdList.add (hund); Dyresvin = nytt dyr (3, "Gris"); duplicatedIdList.add (gris); Animal cow = new Animal (4, "Cow"); duplicatedIdList.add (ku); Dyregeit = nytt dyr (4, "Geit"); duplicatedIdList.add (geit); }

Som vist ovenfor, ku og geit har det samme id.

7.2. Kontrollere atferd

Java Kart‘S sette() metoden er implementert slik at den siste merverdien overskriver den forrige med samme nøkkel.

Av denne grunn, den tradisjonelle konvertering og Apache Commons MapUtils.populateMap () oppføre seg på samme måte:

@Test offentlig ugyldig nårConvertBeforeJava8_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListBeforeJava8 (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); } @Test offentlig ugyldig nårConvertWithApacheCommons_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListWithApacheCommons (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); }

Som man kan se, er geit overskriver ku med det samme id.

I motsetning til det, Collectors.toMap () og MapUtils.populateMap () kaste IllegalStateException og IllegalArgumentException henholdsvis:

@Test (forventet = IllegalStateException.class) offentlig ugyldig gittADupIdList_whenConvertAfterJava8_thenException () {convertListService.convertListAfterJava8 (duplicatedIdList); } @Test (forventet = IllegalArgumentException.class) offentlig tomrom gittADupIdList_whenConvertWithGuava_thenException () {convertListService.convertListWithGuava (duplicatedIdList); }

8. Konklusjon

I denne raske artikkelen har vi dekket forskjellige måter å konvertere en Liste til en Kart, gir eksempler med kjerne Java samt noen populære tredjepartsbiblioteker.

Som vanlig er den komplette kildekoden tilgjengelig på GitHub.


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