Eu preciso inicializar um HashMap constante e gostaria de fazê-lo em uma instrução de linha. Evitando sth assim:
hashMap.put("One", new Integer(1)); // adding value into HashMap
hashMap.put("Two", new Integer(2));
hashMap.put("Three", new Integer(3));
semelhante a isso no objetivo C:
[NSDictionary dictionaryWithObjectsAndKeys:
@"w",[NSNumber numberWithInt:1],
@"K",[NSNumber numberWithInt:2],
@"e",[NSNumber numberWithInt:4],
@"z",[NSNumber numberWithInt:5],
@"l",[NSNumber numberWithInt:6],
nil]
Não encontrei nenhum exemplo que mostre como fazer isso, tendo analisado tantos.
Você pode usar o ImmutableMap do Google Guava. Isso funciona desde que você não se preocupe em modificar o mapa posteriormente (não é possível chamar .put () no mapa depois de construí-lo usando este método):
Veja também: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html
Uma pergunta um tanto relacionada: solução alternativa ImmutableMap.of () para o HashMap no Maps?
fonte
ImmutableMap
não aceitanull
chaves ou valores.Desde o Java 9, é possível usar
Map.of(...)
, assim:Este mapa é imutável. Se você deseja que o mapa seja mutável, é necessário adicionar:
Se você não pode usar o Java 9, você está gravando um método auxiliar semelhante ou usando uma biblioteca de terceiros (como o Guava ) para adicionar essa funcionalidade a você.
fonte
Map.of
apenas dez entradas são feitas, uma vez que é bastante trabalhosoJava não tem mapa literal, portanto, não há uma maneira agradável de fazer exatamente o que você está pedindo.
Se você precisar desse tipo de sintaxe, considere algum Groovy, que é compatível com Java e permite:
fonte
Os mapas também tiveram métodos de fábrica adicionados no Java 9. Para até 10 entradas, os mapas sobrecarregaram os construtores que recebem pares de chaves e valores. Por exemplo, podemos construir um mapa de várias cidades e suas populações (de acordo com o Google em outubro de 2016) da seguinte forma:
O caso var-args do Map é um pouco mais difícil, você precisa ter chaves e valores, mas em Java, os métodos não podem ter dois parâmetros var-args. Portanto, o caso geral é tratado usando um método de
Map.Entry<K, V>
objetos var-args e adicionando umentry()
método estático que os constrói. Por exemplo:Métodos de Fábrica de Coleta em Java 9
fonte
Aqui está uma classe simples que realizará o que você deseja
E então usá-lo
Isso gera
{a:1, b:2}
fonte
Ignorando a declaração de
x
(que é necessária para evitar um diagnóstico de "declaração inacessível"), tecnicamente é apenas uma declaração.fonte
Você pode adicionar esta função de utilitário a uma classe de utilitário:
Nota:
Java 9
você pode usar o Map.offonte
Outra abordagem pode estar escrevendo uma função especial para extrair todos os valores dos elementos de uma string por expressão regular:
fonte