initialisation d'un Guava ImmutableMap

140

Guava offre un bon raccourci pour initialiser une carte. Cependant, j'obtiens l'erreur de compilateur suivante (Eclipse Indigo) lorsque ma carte s'initialise à neuf entrées.

La méthode of(K, V, K, V, K, V, K, V, K, V)dans le type ImmutableMapn'est pas applicable pour les arguments (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"
        );

Le message semble dire que

Un ImmutableMap a une taille maximale de quatre paires de clé, valeur.

Évidemment, cela ne peut pas être le cas mais je ne sais pas quoi faire pour augmenter la taille de mon initialiseur.

Quelqu'un peut-il me dire ce qui manque?

utilisateur903724
la source

Réponses:

256

Notez que votre message d'erreur ne contient que cinq K, Vpaires, 10 arguments au total. C'est par conception; la classe ImmutableMap fournit six of()méthodes différentes , acceptant entre zéro et cinq paires clé-valeur. Il n'y a pas de of(...)surcharge acceptant un paramètre varags car Ket Vpeut être de types différents.

Vous voulez 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();
Jon Skeet
la source
Merci pour les réponses rapides. J'ai décidé d'essayer Guava parce que je ne voulais pas avoir à taper tous les «put» requis par un initialiseur de carte standard. Voilà pour cette idée!
user903724
7
@ user903724: La principale raison d'utiliser Guava ici est la forte immuabilité, IMO.
Jon Skeet
2
Cela, ou la consommation de mémoire légèrement réduite - et la syntaxe du constructeur est assez fluide, au fur et à mesure.
Louis Wasserman
2
eh bien, vous pouvez avoir plusieurs mises encore, mais ils utilisent maintenant une API fluide, donc pas besoin de répéter myMappour chacun.put
Kevin Welker
21
Remarquez également comment l'exemple de code de Jon pourrait être a public static finalet qu'il fonctionne toujours, pas besoin d'une méthode d'assistance ou d'un static{}initialiseur!
Kevin Bourrillion
62

si la carte est courte, vous pouvez faire:

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

Si c'est plus long alors:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Nathan Feger
la source
9
Outre la lisibilité, vous pouvez utiliser ImmutableMap.ofla fabrique statique pour jusqu'à cinq paires de valeurs clés. Ensuite, vous devez utiliser builder.
Xaerxess
0

"put" est obsolète , abstenez-vous de l'utiliser, utilisez plutôt .of

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);
coda
la source
3
Non. ImmutableMap.put est obsolète. Jon Skeet utilise ImmutableMap.Builder.put, qui est exactement la façon dont nous devrions initialiser une carte avec plus de 5 tuples.
i2B