Hogyan lehet konvertálni a listát térképre Java-ban

1. Áttekintés

Konvertálás Lista nak nek Térkép általános feladat. Ebben az oktatóanyagban többféle módon foglalkozunk ezzel.

Feltételezzük, hogy a Lista rendelkezik egy azonosítóval, amelyet kulcsként fognak használni az eredményként Térkép.

2. Mintadat-struktúra

Először modellezzük az elemet:

public class Animal {private int id; privát karakterlánc neve; // konstruktor / getters / setters}

A id mező egyedülálló, ezért a kulcssá tehetjük.

Kezdjük a konvertálást a hagyományos módon.

3. Java 8 előtt

Nyilvánvalóan átalakíthatjuk a Lista a Térkép alapvető Java módszerekkel:

public Map convertListBeforeJava8 (Lista lista) {Térkép térkép = új HashMap (); mert: (Animal animal: list) {map.put (animal.getId (), animal); } visszatérési térkép; }

Teszteljük a konverziót:

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

4. Java 8-tal

A Java 8-tól kezdve a Lista ba be Térkép patakok felhasználásával és Gyűjtők:

 public Map convertListAfterJava8 (List list) {Map map = list.stream () .collect (Collectors.toMap (Animal :: getId, animal -> animal)); visszatérő térkép; }

Ellenőrizzük ismét, hogy az átalakítás helyesen történt-e:

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

5. A guavai könyvtár használata

Az alapvető Java mellett harmadik fél könyvtárait is felhasználhatjuk az átalakításhoz.

5.1. Maven konfiguráció

Először hozzá kell adnunk a következő függőséget pom.xml:

 com.google.guava guava 23.6.1-jre 

A könyvtár legújabb verziója mindig itt található.

5.2. Átalakítás vele Maps.uniqueIndex ()

Másodszor, használjuk Maps.uniqueIndex () módszer a Lista ba be Térkép:

public Map convertListWithGuava (Lista lista) {Térkép térkép = Maps .uniqueIndex (lista, Animal :: getId); visszatérő térkép; }

Végül teszteljük az átalakítást:

@Test public void whenConvertWithGuava_thenReturnMapWithTheSameElements () {Map map = convertListService .convertListWithGuava (list); assertThat (map.values ​​(), tartalmazzaInAnyOrder (list.toArray ())); } 

6. Az Apache Commons Library használata

Átalakítást is végezhetünk aaz Apache Commons könyvtár metódusa.

6.1. Maven konfiguráció

Először is vegyük bele a Maven-függőséget:

 org.apache.commons commons-gyűjtemények4 4.2 

A függőség legújabb verziója itt érhető el.

6.2. MapUtils

Másodsorban a konverziót felhasználjuk MapUtils.populateMap ():

public Map convertListWithApacheCommons2 (Lista lista) {Térkép térkép = új HashMap (); MapUtils.populateMap (térkép, lista, Animal :: getId); visszatérő térkép; }

Végül ellenőrizzük, hogy a várt módon működik-e:

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

7. Értékkonfliktus

Ellenőrizzük, mi történik, ha a id mező nem egyedi.

7.1. Lista nak,-nek Állatok Másolattal Ids

Először hozzuk létre a Lista nak,-nek Állats nem egyedi ids:

@A nyilvános void előtt init () {this.duplicatedIdList = new ArrayList (); Állati macska = új állat (1, "Macska"); duplicatedIdList.add (macska); Állati kutya = új állat (2, "Kutya"); duplicatedIdList.add (kutya); Állati sertés = új állat (3, "Disznó"); duplicatedIdList.add (disznó); Állati tehén = új állat (4, "Tehén"); duplicatedIdList.add (tehén); Állati kecske = új állat (4, "Kecske"); duplicatedIdList.add (kecske); }

Amint fentebb látható, a tehén és a kecske legyen ugyanaz id.

7.2. A viselkedés ellenőrzése

Jáva Térkép’S put () metódust úgy valósítják meg, hogy a legújabb hozzáadott érték felülírja az előzőt ugyanazzal a kulccsal.

Emiatt a hagyományos konverzió és az Apache Commons MapUtils.populateMap () ugyanúgy viselkedjen:

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

Mint látható, a kecske felülírja a tehén ugyanazzal id.

Ettől eltérően Collectors.toMap () és MapUtils.populateMap () dobás IllegalStateException és IllegalArgumentException illetőleg:

@Test (várható = IllegalStateException.class) public void givenADupIdList_whenConvertAfterJava8_thenException () {convertListService.convertListAfterJava8 (duplicatedIdList); } @Test (várható = IllegalArgumentException.class) public void givenADupIdList_whenConvertWithGuava_thenException () {convertListService.convertListWithGuava (duplicatedIdList); }

8. Következtetés

Ebben a rövid cikkben a Lista a Térkép, példákat hoz fel az alapvető Java-val, valamint néhány népszerű, harmadik féltől származó könyvtárral.

Szokás szerint a teljes forráskód elérhető a GitHubon.