Guava Multimap-Anleitung

1. Überblick

In diesem Artikel betrachten wir eine der Map -Implementierungen aus der Google Guava-Bibliothek - Multimap . Es ist eine Auflistung, die Schlüssel auf Werte abbildet, ähnlich wie java.util.Map , wobei jedoch jeder Schlüssel mit mehreren Werten verknüpft werden kann.

2. Maven-Abhängigkeit

Zuerst fügen wir eine Abhängigkeit hinzu:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>21.0</version>
</dependency>

Die neueste Version finden Sie unter Hier .

3. Multimap -Implementierung

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

String key = "a-key";
Multimap<String, String> map = ArrayListMultimap.create();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(2, map.size());

Das Drucken des map -Inhalts wird ausgegeben:

{a-key=[firstValue, secondValue]}

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

Collection<String> values = map.get(key);

Druckwerte werden ausgegeben:

----[firstValue, secondValue]----

4. Im Vergleich zum Standard Map

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

String key = "a-key";
Map<String, String> map = new LinkedHashMap<>();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(1, map.size());

Die resultierende map hat nur ein Element ( "secondValue"), aufgrund einer zweiten put () -Operation, die den ersten Wert überschreibt. Wenn Sie dasselbe Verhalten wie mit Multimap von Guava erreichen möchten, müssen Sie eine Map erstellen, die als Werttyp List <String> enthält:

String key = "a-key";
Map<String, List<String>> map = new LinkedHashMap<>();

List<String> values = map.get(key);
if(values == null) {
    values = new LinkedList<>();
    values.add("firstValue");
    values.add("secondValue");
 }

map.put(key, values);

assertEquals(1, map.size());

Es ist offensichtlich nicht sehr bequem zu benutzen. Und wenn wir einen solchen Bedarf in unserem Code haben, könnte die Multimap von Guava eine bessere Wahl sein als java.util.Map.

Hierbei ist Folgendes zu beachten: Obwohl wir eine Liste mit zwei Elementen haben, gibt die size () -Methode 1 zurück. ) .size () __ gibt die Anzahl der verschiedenen Schlüssel zurück.

5. Vorteile von Multimap

Multimaps werden häufig an Orten verwendet, an denen sonst eine Map <K, Collection <V >> erscheinen würde. Die Unterschiede beinhalten:

  • Es ist nicht erforderlich, eine leere Sammlung aufzufüllen, bevor Sie eine hinzufügen

Eintrag mit put () ** Die get () - Methode gibt niemals null zurück, nur eine leere Sammlung (wir

Sie müssen nicht mit null prüfen, wie in Map <String, Collection <V >> Testfall) ** Ein Schlüssel ist nur dann in der Multimap enthalten, wenn er zu at zugeordnet wird

mindestens einen Wert. Jede Operation, bei der ein Schlüssel ausgelöst wird, ist mit Null verknüpft Werte, bewirkt, dass dieser Schlüssel aus der Multimap (in Map <String, Collection <V >>, auch wenn wir alle Werte aus dem entfernen Sammlung, wir behalten immer noch eine leere Collection als Wert, und das ist unnötiger Speicheraufwand) ** Die Gesamtzahl der Eintragswerte steht als size () zur Verfügung.

6. Fazit

Dieser Artikel zeigt, wie und wann Guava Multimap. verwendet wird. Er vergleicht den Standard java.util.Map und zeigt die Vorteile von Guava Multimap.

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