Initialisieren einer Guava ImmutableMap

140

Guave bietet eine nette Verknüpfung zum Initialisieren einer Karte. Ich erhalte jedoch den folgenden Compilerfehler (Eclipse Indigo), wenn meine Map mit neun Einträgen initialisiert wird.

Die Methode of(K, V, K, V, K, V, K, V, K, V)im Typ ImmutableMapgilt nicht für die Argumente (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

Die Nachricht scheint das zu sagen

Eine ImmutableMap hat eine maximale Größe von vier Schlüsselpaaren.

Dies kann natürlich nicht der Fall sein, aber ich kann nicht herausfinden, was ich tun soll, um die Größe meines Initialisierers zu erhöhen.

Kann mir jemand sagen, was fehlt?

user903724
quelle

Antworten:

256

Beachten Sie, dass Ihre Fehlermeldung nur fünf K, VPaare enthält , insgesamt 10 Argumente. Dies ist beabsichtigt; Die ImmutableMap-Klasse bietet sechs verschiedene of()Methoden, die zwischen null und fünf Schlüssel-Wert-Paarungen akzeptieren. Es ist keine of(...)Überlastung zu akzeptieren ein varags Parameter da Kund Vkönnen unterschiedlicher Art sein.

Sie möchten eine ImmutableMap.Builder:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();
Jon Skeet
quelle
Danke für die schnellen Antworten. Ich habe mich für Guava entschieden, weil ich nicht alle 'Puts' eingeben musste, die für einen Standard-Karteninitialisierer erforderlich sind. Soviel zu dieser Idee!
user903724
7
@ user903724: Der Hauptgrund für die Verwendung von Guava ist die starke Unveränderlichkeit, IMO.
Jon Skeet
2
Das oder der leicht reduzierte Speicherverbrauch - und die Builder-Syntax ist im Laufe der Zeit ziemlich fließend.
Louis Wasserman
2
Nun, Sie haben vielleicht noch mehrere Puts, aber sie verwenden jetzt eine fließende API, so dass Sie nicht myMapfür jeden wiederholen müssen.put
Kevin Welker
21
Beachten Sie auch, wie Jons Beispielcode ein sein könnte public static finalund er immer noch funktioniert, ohne dass eine Hilfsmethode oder ein static{}Initialisierer erforderlich sind !
Kevin Bourrillion
62

Wenn die Karte kurz ist, können Sie Folgendes tun:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

Wenn es länger ist als:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Nathan Feger
quelle
9
Neben der Lesbarkeit können Sie die ImmutableMap.ofstatische Factory für bis zu fünf Schlüsselwertpaare verwenden. Dann müssen Sie Builder verwenden.
Xaerxess
0

"put" ist veraltet . Verwenden Sie es nicht. Verwenden Sie stattdessen .of

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);
Koda
quelle
3
ImmutableMap.put ist veraltet. Jon Skeet verwendet ImmutableMap.Builder.put. Genau so sollten wir eine Karte mit mehr als 5 Tupeln initialisieren.
i2B