inicializando um ImmutableMap da goiaba

140

O Goiaba oferece um bom atalho para inicializar um mapa. No entanto, recebo o seguinte erro do compilador (Eclipse Indigo) quando meu mapa é inicializado em nove entradas.

O método of(K, V, K, V, K, V, K, V, K, V)no tipo ImmutableMapnão é aplicável aos 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"
        );

A mensagem parece dizer que

Um ImmutableMap tem um tamanho máximo de quatro pares de chave, valor.

Obviamente, esse não pode ser o caso, mas não consigo descobrir o que fazer para aumentar o tamanho do meu inicializador.

Alguém pode me dizer o que está faltando?

user903724
fonte

Respostas:

256

Observe que sua mensagem de erro contém apenas cinco K, Vpares, 10 argumentos no total. Isso é por design; a classe ImmutableMap fornece seis of()métodos diferentes , aceitando entre zero e cinco pares de valores-chave. Não há uma of(...)sobrecarga aceitando um parâmetro varags porque Ke Vpode ser de tipos diferentes.

Você quer um 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
fonte
Obrigado pelas respostas rápidas. Decidi experimentar o Guava porque não queria digitar todos os 'put' exigidos por um inicializador de mapa padrão. Tanta coisa para essa ideia!
user903724
7
@ user903724: A principal razão para usar o Goiaba aqui é a forte imutabilidade, IMO.
31812 Jon Skeet
2
Isso, ou o consumo de memória ligeiramente reduzido - e a sintaxe do construtor é bastante fluente, conforme as coisas acontecem.
Louis Wasserman
2
bem, você pode ter várias opções de venda ainda, mas eles agora estão usando API fluente, então não há necessidade de repetir myMappara cada.put
Kevin Welker
21
Observe também como o código de exemplo de Jon poderia ser um public static finale ainda funciona, sem necessidade de um método auxiliar ou static{}inicializador!
22712 Kevin Kevin Bourrillion
62

se o mapa for curto, você pode:

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

Se for mais longo, então:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Nathan Feger
fonte
9
Além da legibilidade, você pode usar a ImmutableMap.offábrica estática para até cinco pares de valores-chave. Então você tem que usar o construtor.
Xaerxess
0

"put" foi descontinuado , evite usá-lo, use .of em vez disso

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);
coda
fonte
3
Não. O ImmutableMap.put foi descontinuado. Jon Skeet está usando ImmutableMap.Builder.put, que é exatamente como devemos inicializar um mapa com mais de 5 tuplas.
i2B