Sådan konverteres liste til kort i Java

1. Oversigt

Konvertering Liste til Kort er en fælles opgave. I denne vejledning dækker vi flere måder at gøre dette på.

Vi antager, at hvert element i Liste har en identifikator, som vil blive brugt som en nøgle i det resulterende Kort.

2. Eksempel på datastruktur

Lad os først modellere elementet:

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

Det id felt er unikt, derfor kan vi gøre det til nøglen.

Lad os begynde at konvertere på den traditionelle måde.

3. Før Java 8

Vi kan åbenbart konvertere en Liste til en Kort ved hjælp af kernemetoder til Java:

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

Lad os teste konverteringen:

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

4. Med Java 8

Fra og med Java 8 kan vi konvertere en Liste ind i en Kort ved hjælp af streams og Samlere:

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

Lad os igen sikre os, at konverteringen sker korrekt:

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

5. Brug af Guava-biblioteket

Udover Java-kernen kan vi bruge tredjepartsbiblioteker til konverteringen.

5.1. Maven-konfiguration

For det første skal vi tilføje følgende afhængighed til vores pom.xml:

 com.google.guava guava 23.6.1-jre 

Den seneste version af dette bibliotek kan altid findes her.

5.2. Konvertering med Maps.uniqueIndex ()

For det andet, lad os bruge Maps.uniqueIndex () metode til at konvertere en Liste ind i en Kort:

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

Lad os endelig teste konverteringen:

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

6. Brug af Apache Commons Library

Vi kan også foretage en konvertering medmetode til Apache Commons-bibliotek.

6.1. Maven-konfiguration

Lad os først inkludere Maven-afhængighed:

 org.apache.commons commons-collection4 4.2 

Den seneste version af denne afhængighed er tilgængelig her.

6.2. MapUtils

For det andet foretager vi konverteringen ved hjælp af MapUtils.populateMap ():

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

Endelig lad os sørge for, at det fungerer som forventet:

@Test offentligt ugyldigt nårConvertWithApacheCommons2_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithApacheCommons2 (list); assertThat (map.values ​​(), indeholderInAnyOrder (list.toArray ())); }

7. Værdikonflikt

Lad os kontrollere, hvad der sker, hvis id felt er ikke unikt.

7.1. Liste af Dyr Med duplikeret Ids

Lad os først oprette en Liste af Dyrs med ikke-unik ids:

@Før offentlig ugyldig init () {this.duplicatedIdList = ny ArrayList (); Dyrekat = nyt dyr (1, "kat"); duplicatedIdList.add (kat); Dyrehund = nyt dyr (2, "Hund"); duplicatedIdList.add (hund); Dyresvin = nyt dyr (3, "Gris"); duplicatedIdList.add (svin); Dyreko = nyt dyr (4, "ko"); duplicatedIdList.add (ko); Dyrgeit = nyt dyr (4, "Ged"); duplicatedIdList.add (ged); }

Som vist ovenfor er ko og ged har det samme id.

7.2. Kontrol af adfærd

Java Kort'S sætte() metoden er implementeret, så den seneste merværdi overskriver den forrige med den samme nøgle.

Af denne grund den traditionelle konvertering og Apache Commons MapUtils.populateMap () opføre sig på samme måde:

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

Som det kan ses, er ged overskriver ko med det samme id.

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

@Test (forventet = IllegalStateException.class) offentlig ugyldighed givetADupIdList_whenConvertAfterJava8_thenException () {convertListService.convertListAfterJava8 (duplicatedIdList); } @Test (forventet = IllegalArgumentException.class) offentlig ugyldighed givetADupIdList_whenConvertWithGuava_thenException () {convertListService.convertListWithGuava (duplicatedIdList); }

8. Konklusion

I denne hurtige artikel har vi dækket forskellige måder at konvertere en Liste til en Kort, giver eksempler med core Java samt nogle populære tredjepartsbiblioteker.

Som sædvanlig er den komplette kildekode tilgængelig på GitHub.