Hoe lijst naar kaart in Java te converteren

1. Overzicht

Omzetten Lijst naar Kaart is een veel voorkomende taak. In deze tutorial behandelen we verschillende manieren om dit te doen.

We gaan ervan uit dat elk element van de Lijst heeft een identifier die zal worden gebruikt als sleutel in het resulterende Kaart.

2. Voorbeeld van gegevensstructuur

Laten we eerst het element modelleren:

openbare klasse Animal {privé int id; private String naam; // constructor / getters / setters}

De ID kaart veld is uniek, daarom kunnen we er de sleutel van maken.

Laten we beginnen met converteren op de traditionele manier.

3. Voor Java 8

Blijkbaar kunnen we een Lijst naar een Kaart met behulp van Java-kernmethoden:

openbare kaart convertListBeforeJava8 (lijstlijst) {Map map = new HashMap (); voor (Animal animal: list) {map.put (animal.getId (), dier); } terugkeer kaart; }

Laten we de conversie testen:

@Test openbare leegte whenConvertBeforeJava8_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListBeforeJava8 (lijst); assertThat (map.values ​​(), bevatInAnyOrder (list.toArray ())); }

4. Met Java 8

Beginnend met Java 8 kunnen we een Lijst in een Kaart met behulp van streams en Verzamelaars:

 openbare kaart convertListAfterJava8 (lijstlijst) {Map map = list.stream () .collect (Collectors.toMap (Animal :: getId, animal -> animal)); kaart teruggeven; }

Nogmaals, laten we ervoor zorgen dat de conversie correct wordt uitgevoerd:

@Test openbare leegte whenConvertAfterJava8_thenReturnMapWithTheSameElements () {Map map = convertListService.convertListAfterJava8 (lijst); assertThat (map.values ​​(), bevatInAnyOrder (list.toArray ())); }

5. Met behulp van de Guava-bibliotheek

Naast core Java kunnen we bibliotheken van derden gebruiken voor de conversie.

5.1. Maven-configuratie

Ten eerste moeten we de volgende afhankelijkheid toevoegen aan onze pom.xml:

 com.google.guava guave 23.6.1-jre 

De laatste versie van deze bibliotheek is hier altijd te vinden.

5.2. Conversie met Maps.uniqueIndex ()

Ten tweede, laten we gebruiken Maps.uniqueIndex () methode om een Lijst in een Kaart:

openbare kaart convertListWithGuava (lijstlijst) {Map map = Maps .uniqueIndex (lijst, Animal :: getId); kaart teruggeven; }

Laten we tot slot de conversie testen:

@Test openbare leegte whenConvertWithGuava_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithGuava (lijst); assertThat (map.values ​​(), bevatInAnyOrder (list.toArray ())); } 

6. Apache Commons Library gebruiken

We kunnen ook een conversie maken met demethode van Apache Commons-bibliotheek.

6.1. Maven-configuratie

Laten we eerst de afhankelijkheid van Maven opnemen:

 org.apache.commons commons-collections4 4.2 

De nieuwste versie van deze afhankelijkheid is hier beschikbaar.

6.2. MapUtils

Ten tweede maken we de conversie met MapUtils.populateMap ():

openbare kaart convertListWithApacheCommons2 (lijstlijst) {Map map = new HashMap (); MapUtils.populateMap (kaart, lijst, Animal :: getId); kaart teruggeven; }

Laten we er ten slotte voor zorgen dat het werkt zoals verwacht:

@Test openbare leegte whenConvertWithApacheCommons2_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithApacheCommons2 (lijst); assertThat (map.values ​​(), bevatInAnyOrder (list.toArray ())); }

7. Tegenstrijdige waarden

Laten we eens kijken wat er gebeurt als het ID kaart veld is niet uniek.

7.1. Lijst van Dieren Met gedupliceerd ID kaarts

Laten we eerst een Lijst van Diers met niet-uniek ID kaarts:

@Before public void init () {this.duplicatedIdList = nieuwe ArrayList (); Dierlijke kat = nieuw Dier (1, "Kat"); duplicatedIdList.add (kat); Dierlijke hond = nieuw Dier (2, "Hond"); duplicatedIdList.add (hond); Dierlijk varken = nieuw dier (3, "Varken"); duplicatedIdList.add (varken); Dierlijke koe = nieuw dier (4, "Koe"); duplicatedIdList.add (koe); Dierlijke geit = nieuw dier (4, "Geit"); duplicatedIdList.add (geit); }

Zoals hierboven getoond, is de koe en de geit hebben hetzelfde ID kaart.

7.2. Het gedrag controleren

Java Kaart‘S leggen() methode is zo geïmplementeerd dat de laatste toegevoegde waarde de vorige overschrijft met dezelfde sleutel.

Om deze reden zijn de traditionele conversie en Apache Commons MapUtils.populateMap () gedragen zich op dezelfde manier:

@Test openbare leegte whenConvertBeforeJava8_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListBeforeJava8 (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); } @Test openbare leegte whenConvertWithApacheCommons_thenReturnMapWithRewrittenElement () {Map map = convertListService .convertListWithApacheCommons (duplicatedIdList); assertThat (map.values ​​(), hasSize (4)); assertThat (map.values ​​(), hasItem (duplicatedIdList.get (4))); }

Zoals te zien is, is de geit overschrijft het koe met hetzelfde ID kaart.

In tegenstelling tot dat, Collectors.toMap () en MapUtils.populateMap () werpen IllegalStateException en IllegalArgumentException respectievelijk:

@Test (verwacht = IllegalStateException.class) openbare ongeldige gegevenADupIdList_whenConvertAfterJava8_thenException () {convertListService.convertListAfterJava8 (duplicatedIdList); } @Test (verwacht = IllegalArgumentException.class) openbare leegte gegevenADupIdList_whenConvertWithGuava_thenException () {convertListService.convertListWithGuava (duplicatedIdList); }

8. Conclusie

In dit korte artikel hebben we verschillende manieren besproken om een Lijst naar een Kaart, voorbeelden geven met core Java en enkele populaire bibliotheken van derden.

Zoals gewoonlijk is de volledige broncode beschikbaar op GitHub.