inizializzazione di una Guava ImmutableMap


140

Guava offre una scorciatoia per l'inizializzazione di una mappa. Comunque ottengo il seguente errore del compilatore (Eclipse Indigo) quando la mia mappa si inizializza a nove voci.

Il metodo of(K, V, K, V, K, V, K, V, K, V)nel tipo ImmutableMapnon è applicabile per gli argomenti (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"
        );

Il messaggio sembra dirlo

Una ImmutableMap ha una dimensione massima di quattro coppie di chiave, valore.

Ovviamente, questo non può essere il caso, ma non riesco a capire cosa fare per aumentare le dimensioni del mio inizializzatore.

Qualcuno può dirmi cosa manca?

Risposte:


256

Si noti che il messaggio di errore contiene solo cinque K, Vcoppie, 10 argomenti in totale. Questo è di progettazione; la classe ImmutableMap fornisce sei of()metodi diversi , accettando tra zero e cinque coppie chiave-valore. Non esiste un of(...)sovraccarico che accetta un parametro varags perché Ke Vpuò essere di diversi tipi.

Vuoi un 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();

Grazie per le risposte rapide. Ho deciso di provare Guava perché non volevo digitare tutti i 'put' richiesti da un inizializzatore di mappe standard. Questo per l'idea!
user903724,

7
@ user903724: Il motivo principale per l'utilizzo di Guava qui è la forte immutabilità, IMO.
Jon Skeet,

2
Questo, o il consumo di memoria leggermente ridotto, e la sintassi del builder è piuttosto fluida, come vanno le cose.
Louis Wasserman,

2
bene, potresti avere più put ancora, ma ora stanno usando un'API fluente, quindi non è necessario ripeterli myMapper ciascuno.put
Kevin Welker,

21
Nota anche come il codice di esempio di Jon potrebbe essere un public static finale funziona ancora, non è necessario un metodo di supporto o un static{}inizializzatore!
Kevin Bourrillion,

62

se la mappa è corta puoi fare:

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

Se è più lungo, allora:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

9
Oltre alla leggibilità, è possibile utilizzare ImmutableMap.offactory statica per un massimo di cinque coppie di valori-chiave. Quindi devi usare builder.
Xaerxess,

0

"put" è stato deprecato , astenersi dall'usarlo, utilizzare invece .of

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);

3
No. ImmutableMap.put è obsoleto. Jon Skeet sta usando ImmutableMap.Builder.put, che è esattamente come dovremmo inizializzare una mappa con più di 5 tuple.
i2B,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.