So konvertieren Sie eine Liste in eine Karte in Java

1. Übersicht

Das Konvertieren von Listen in Karten ist eine häufige Aufgabe. In diesem Tutorial werden verschiedene Möglichkeiten beschrieben, dies zu tun.

Wir gehen davon aus, dass jedes Element der Liste einen Bezeichner hat, der als Schlüssel in der resultierenden Karte verwendet wird .

2. Beispieldatenstruktur

Lassen Sie uns zunächst das Element modellieren:

public class Animal { private int id; private String name; // constructor/getters/setters }

Das ID- Feld ist eindeutig, daher können wir es zum Schlüssel machen.

Beginnen wir mit der traditionellen Konvertierung.

3. Vor Java 8

Offensichtlich können wir eine Liste mit den wichtigsten Java-Methoden in eine Map konvertieren :

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

Testen wir die Konvertierung:

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

4. Mit Java 8

Ab Java 8 können wir eine Liste mithilfe von Streams und Collectors in eine Map konvertieren :

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

Stellen wir erneut sicher, dass die Konvertierung korrekt durchgeführt wird:

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

5. Verwenden der Guavenbibliothek

Neben Core Java können wir für die Konvertierung Bibliotheken von Drittanbietern verwenden.

5.1. Maven-Konfiguration

Zunächst müssen wir unserer pom.xml die folgende Abhängigkeit hinzufügen :

 com.google.guava guava 23.6.1-jre 

Die neueste Version dieser Bibliothek finden Sie immer hier.

5.2. Konvertierung mit Maps.uniqueIndex ()

Zweitens verwenden wir die Maps.uniqueIndex () -Methode, um eine Liste in eine Map zu konvertieren :

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

Lassen Sie uns zum Schluss die Konvertierung testen:

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

6. Verwenden der Apache Commons Library

Wir können auch eine Konvertierung mit dem machenMethode der Apache Commons Bibliothek.

6.1. Maven-Konfiguration

Lassen Sie uns zunächst die Maven-Abhängigkeit einbeziehen:

 org.apache.commons commons-collections4 4.2 

Die neueste Version dieser Abhängigkeit finden Sie hier.

6.2. MapUtils

Zweitens führen wir die Konvertierung mit MapUtils.populateMap () durch :

public Map convertListWithApacheCommons2(List list) { Map map = new HashMap(); MapUtils.populateMap(map, list, Animal::getId); return map; }

Zuletzt stellen wir sicher, dass es wie erwartet funktioniert:

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

7. Wertekonflikt

Lassen Sie uns überprüfen, was passiert, wenn das ID- Feld nicht eindeutig ist.

7.1. Liste der Tiere mit duplizierte Id s

Lassen Sie uns zunächst eine Liste von Tieren mit nicht eindeutigen IDs erstellen :

@Before public void init() { this.duplicatedIdList = new ArrayList(); Animal cat = new Animal(1, "Cat"); duplicatedIdList.add(cat); Animal dog = new Animal(2, "Dog"); duplicatedIdList.add(dog); Animal pig = new Animal(3, "Pig"); duplicatedIdList.add(pig); Animal cow = new Animal(4, "Cow"); duplicatedIdList.add(cow); Animal goat= new Animal(4, "Goat"); duplicatedIdList.add(goat); }

Wie oben gezeigt, haben die Kuh und die Ziege den gleichen Ausweis .

7.2. Überprüfen des Verhaltens

Java Map‘s put() method is implemented so that the latest added value overwrites the previous one with the same key.

For this reason, the traditional conversion and Apache Commons MapUtils.populateMap() behave in the same way:

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

As can be seen, the goat overwrites the cow with the same id.

Unlike that, Collectors.toMap() and MapUtils.populateMap() throw IllegalStateException and IllegalArgumentException respectively:

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

8. Conclusion

In diesem kurzen Artikel haben wir verschiedene Möglichkeiten zum Konvertieren einer Liste in eine Karte behandelt und Beispiele mit Kern-Java sowie einige beliebte Bibliotheken von Drittanbietern gegeben.

Wie üblich ist der vollständige Quellcode auf GitHub verfügbar.