Leitfaden für Guava Multimap

1. Übersicht

In diesem Artikel sehen wir uns eine der Map- Implementierungen aus der Google Guava-Bibliothek an - Multimap . Es handelt sich um eine Sammlung, die Schlüssel Werten ähnlich wie java.util.Map zuordnet, in denen jedoch jeder Schlüssel mehreren Werten zugeordnet sein kann.

2. Maven-Abhängigkeit

Fügen wir zunächst eine Abhängigkeit hinzu:

 com.google.guava guava 29.0-jre 

Die neueste Version finden Sie hier.

3. Multimap- Implementierung

Wenn wir im Fall von Guava Multimap zwei Werte für denselben Schlüssel hinzufügen, überschreibt der zweite Wert nicht den ersten Wert. Stattdessen haben wir zwei Werte in der resultierenden Karte . Schauen wir uns einen Testfall an:

String key = "a-key"; Multimap map = ArrayListMultimap.create(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(2, map.size()); 

Beim Drucken des Karteninhalts wird Folgendes ausgegeben:

{a-key=[firstValue, secondValue]}

Wenn wir Werte mit dem Schlüssel "a-key" erhalten, erhalten wir eine Sammlung , die als Ergebnis "firstValue" und "secondValue" enthält:

Collection values = map.get(key);

Druckwerte werden ausgegeben:

[firstValue, secondValue]

4. Im Vergleich zum Standard - Map

Die Standardzuordnung aus dem Paket java.util bietet uns nicht die Möglichkeit, demselben Schlüssel mehrere Werte zuzuweisen. Betrachten wir einen einfachen Fall , wenn wir setzen () zwei Werte in eine Karte mit dem gleichen Schlüssel:

String key = "a-key"; Map map = new LinkedHashMap(); map.put(key, "firstValue"); map.put(key, "secondValue"); assertEquals(1, map.size()); 

Die resultierende Zuordnung enthält nur ein Element ( "secondValue"), da eine zweite put () -Operation den ersten Wert überschreibt. Wenn wir dasselbe Verhalten wie mit Guavas Multimap erzielen möchten , müssen wir eine Karte erstellen , die eine Liste als Werttyp hat :

String key = "a-key"; Map
    
      map = new LinkedHashMap(); List values = map.get(key); if(values == null) { values = new LinkedList(); values.add("firstValue"); values.add("secondValue"); } map.put(key, values); assertEquals(1, map.size());
    

Offensichtlich ist es nicht sehr bequem zu bedienen. Und wenn wir einen solchen Bedarf in unserem Code haben, könnte Guavas Multimap eine bessere Wahl sein als java.util.Map.

Eine Sache, die hier zu beachten ist, ist, dass, obwohl wir eine Liste mit zwei Elementen haben, die size () -Methode 1 zurückgibt. In Multimap gibt size () eine tatsächliche Anzahl von Werten zurück, die in einer Map gespeichert sind , aber keySet (). Size () gibt die Anzahl der unterschiedlichen Schlüssel zurück.

5. Vorteile von Multimap

Multimaps werden häufig an Orten verwendet, an denen eine Karte vorhanden ist wäre sonst erschienen. Die Unterschiede umfassen:

  • Es ist nicht erforderlich, eine leere Sammlung zu füllen, bevor Sie einen Eintrag mit put () hinzufügen.
  • Die get () -Methode gibt niemals null zurück , sondern nur eine leere Sammlung (wir müssen nicht wie in Map gegen null prüfen Testfall)
  • Ein Schlüssel ist genau dann in der Multimap enthalten, wenn er mindestens einem Wert zugeordnet ist. Jede Operation, bei der einem Schlüssel keine Werte zugeordnet werden, bewirkt, dass dieser Schlüssel aus der Multimap (in Map) entfernt wird , Selbst wenn wir alle Werte aus der Sammlung entfernen, behalten wir eine leere Sammlung als Wert bei, und dies ist unnötiger Speicheraufwand.
  • Die Gesamtzahl der Eingabewerte ist als size () verfügbar.

6. Fazit

Dieser Artikel zeigt, wie und wann Guava Multimap verwendet wird. Es vergleicht sie mit Standard java.util.Map und zeigt Vorteile von Guava Multimap.

Alle diese Beispiele und Codefragmente finden Sie im GitHub-Projekt - dies ist ein Maven-Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.