inicializando un mapa inmutable de guayaba

140

La guayaba ofrece un buen atajo para inicializar un mapa. Sin embargo, aparece el siguiente error del compilador (Eclipse Indigo) cuando mi mapa se inicializa en nueve entradas.

El método of(K, V, K, V, K, V, K, V, K, V)en el tipo ImmutableMapno es aplicable para los argumentos (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"
        );

El mensaje parece decir que

Un ImmutableMap tiene un tamaño máximo de cuatro pares de clave, valor.

Obviamente, este no puede ser el caso, pero no puedo entender qué hacer para aumentar el tamaño de mi inicializador.

¿Alguien puede decirme lo que falta?

usuario903724
fuente

Respuestas:

256

Observe que su mensaje de error solo contiene cinco K, Vpares, 10 argumentos en total. Esto es por diseño; la clase ImmutableMap proporciona seis of()métodos diferentes , aceptando entre cero y cinco emparejamientos clave-valor. No hay una of(...)sobrecarga de aceptar un parámetro varags debido Ky Vpuede haber diferentes tipos.

Quieres 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
fuente
Gracias por las respuestas rápidas. Decidí probar Guava porque no quería tener que escribir todos los 'lugares' requeridos por un inicializador de mapa estándar. Demasiado para esa idea!
user903724
77
@ user903724: La razón principal para usar Guava aquí es la fuerte inmutabilidad, IMO.
Jon Skeet
2
Eso, o el consumo de memoria ligeramente reducido, y la sintaxis del generador es bastante fluida, a medida que avanzan las cosas.
Louis Wasserman
2
bueno, puede que tengas múltiples put todavía, pero ahora están usando una API fluida, por lo que no es necesario repetir myMappara cada uno de ellos.put
Kevin Welker,
21
¡Observe también cómo el código de ejemplo de Jon podría ser un public static finaly sigue funcionando, sin necesidad de un método auxiliar o static{}inicializador!
Kevin Bourrillion
62

si el mapa es corto puedes hacer:

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

Si es más largo, entonces:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Nathan Feger
fuente
9
Además de la legibilidad, puede usar ImmutableMap.ofla fábrica estática para hasta cinco pares de valores clave. Entonces tienes que usar el constructor.
Xaerxess
0

"put" ha quedado en desuso , abstenerse de usarlo, use .of en su lugar

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);
coda
fuente
3
No. ImmutableMap.put está en desuso. Jon Skeet está utilizando ImmutableMap.Builder.put, que es exactamente cómo deberíamos inicializar un mapa con más de 5 tuplas.
i2B