So konvertieren Sie eine Liste in Java in einer Karte

So konvertieren Sie List to Map in Java

1. Überblick

Das Konvertieren vonList inMap ist eine häufige Aufgabe. In diesem Tutorial werden verschiedene Möglichkeiten beschrieben, dies zu tun.

Wir gehen davon aus, dass jedes Element derList eine Kennung hat, die als Schlüssel für die resultierendenMap 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 Feldidist eindeutig, daher können wir es zum Schlüssel machen.

Beginnen wir mit der traditionellen Konvertierung.

3. Vor Java 8

Offensichtlich können wir einList in einMap mit den wichtigsten Java-Kernmethoden 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 wirList mithilfe von Streams undCollectors inMap 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 wurde:

@Test
public void whenConvertAfterJava8_thenReturnMapWithTheSameElements() {
    Map map = convertListService.convertListAfterJava8(list);

    assertThat(
      map.values(),
      containsInAnyOrder(list.toArray()));
}

5. Verwenden der Guavenbibliothek

Neben dem Java-Kern können wir für die Konvertierung auch Bibliotheken von Drittanbietern verwenden.

5.1. Maven-Konfiguration

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


    com.google.guava
    guava
    23.6.1-jre

Die neueste Version dieser Bibliothek befindet sich immer inhere.

5.2. Umrechnung mitMaps.uniqueIndex()

Zweitens verwenden wir die MethodeMaps.uniqueIndex(), umList inMap umzuwandeln:

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

Lassen Sie uns abschließend 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 der method der Apache Commons-Bibliothek durchführen.

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 isthere verfügbar.

6.2. MapUtils

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

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

Stellen wir zum Schluss sicher, dass es wie erwartet funktioniert:

@Test
public void whenConvertWithApacheCommons2_thenReturnMapWithTheSameElements() {
    Map map = convertListService
      .convertListWithApacheCommons2(list);

    assertThat(
      map.values(),
      containsInAnyOrder(list.toArray()));
}

7. Wertekonflikt

Überprüfen wir, was passiert, wenn das Feldidnicht eindeutig ist.

7.1. List vonAnimals mit dupliziertenids

Zunächst erstellen wirList vonAnimals mit nicht eindeutigenids:

@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, habencow undgoat die gleichenid.

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.

Aus diesem Grund verhalten sich die traditionelle Konvertierung und Apache CommonsMapUtils.populateMap()wie folgt:

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

Wie zu sehen ist, überschreibtgoatcow mit demselbenid.

Im Gegensatz dazu istCollectors.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. Fazit

In diesem kurzen Artikel haben wir verschiedene Möglichkeiten zum Konvertieren vonList inMap, giving-Beispielen mit Java-Kern sowie einigen gängigen Bibliotheken von Drittanbietern behandelt.

Wie üblich ist der vollständige Quellcodeover on GitHub verfügbar.