Como inicializar diretamente um HashMap (de uma maneira literal)?

Existe alguma maneira de inicializar um Java HashMap como este ?:

Map test = new HashMap{"test":"test","test":"test"}; 

Qual seria a syntax correta? Eu não encontrei nada sobre isso. Isso é possível? Eu estou procurando o caminho mais curto / rápido para colocar alguns valores “final / estático” em um mapa que nunca muda e são conhecidos antecipadamente ao criar o mapa.

Não, você terá que adicionar todos os elementos manualmente. Você pode usar um inicializador estático embora:

 public class Demo { private static final Map myMap; static { myMap = new HashMap(); myMap.put("a", "b"); myMap.put("c", "d"); } } 

Note que usar uma function para boot fará o mesmo, mas pode melhorar a legibilidade do código:

 public class Demo { private static final Map myMap = createMap(); private static Map createMap() { Map myMap = new HashMap(); myMap.put("a", "b"); myMap.put("c", "d"); return myMap; } } 

Java 9

No Java 9, são adicionados alguns methods de fábrica que também podem ser usados ​​para simplificar a criação de mapas:

 public class Demo { private static final Map test = Map.of("a", "b", "c", "d"); private static final Map test2 = Map.ofEntries( entry("a", "b"), entry("c", "d") ); } 

No exemplo acima, test e test2 serão os mesmos, apenas com formas diferentes de expressar o mapa. O método Map.of é definido para até dez elementos no mapa, enquanto o método Map.ofEntries não terá esse limite.

Note que, neste caso, o mapa resultante será um mapa imutável. Se você quiser que o mapa seja mutável, você pode copiá-lo novamente, por exemplo, usando mutableMap = new HashMap<>(Map.of("a", "b"));

(Veja também o JEP 269 e o Javadoc )

Este é um caminho.

 HashMap h = new HashMap() {{ put("a","b"); }}; 

No entanto, você deve ter cuidado e certificar-se de entender o código acima (ele cria uma nova class que herda do HashMap). Portanto, você deve ler mais aqui: http://www.c2.com/cgi/wiki?DoubleBraceInitialization , ou simplesmente use o Goiaba:

 Map left = ImmutableMap.of("a", 1, "b", 2, "c", 3); 

Se você permitir libs de terceiros, poderá usar o ImmutableMap da Guava para obter uma brevidade literal:

 Map test = ImmutableMap.of("k1", "v1", "k2", "v2"); 

Isso funciona para até 5 pares de chave / valor , caso contrário, você pode usar seu construtor :

 Map test = ImmutableMap.builder() .put("k1", "v1") .put("k2", "v2") ... .build(); 

  • note que a implementação ImmutableMap da Guava difere da implementação HashMap do Java (mais notavelmente é imutável e não permite chaves / valores nulos)
  • para mais informações, consulte o artigo do guia do usuário da Guava sobre seus tipos de coleção imutáveis

Não há uma maneira direta de fazer isso – o Java não possui literais de mapa (ainda assim – eu acho que eles foram propostos para o Java 8).

Algumas pessoas gostam disso:

 Map test = new HashMap(){{ put("test","test"); put("test","test");}}; 

Isso cria uma subclass anônima do HashMap, cujo inicializador de instância coloca esses valores. (By the way, um mapa não pode conter duas vezes o mesmo valor, seu segundo colocar irá replace o primeiro. Vou usar valores diferentes para os próximos exemplos.)

O caminho normal seria isso (para uma variável local):

 Map test = new HashMap(); test.put("test","test"); test.put("test1","test2"); 

Se o seu mapa de test for uma variável de instância, coloque a boot em um construtor ou inicializador de instância:

 Map test = new HashMap(); { test.put("test","test"); test.put("test1","test2"); } 

Se o seu mapa de test for uma variável de class, coloque a boot em um inicializador estático:

 static Map test = new HashMap(); static { test.put("test","test"); test.put("test1","test2"); } 

Se você quiser que seu mapa nunca mude, você deve após a boot quebrar seu mapa por Collections.unmodifiableMap(...) . Você pode fazer isso em um inicializador estático também:

 static Map test; { Map temp = new HashMap(); temp.put("test","test"); temp.put("test1","test2"); test = Collections.unmodifiableMap(temp); } 

(Eu não tenho certeza se você pode agora fazer o test final … experimentá-lo e relatar aqui.)

 Map test = new HashMap() { { put(key1, value1); put(key2, value2); } }; 

Uma alternativa, usando classs e varargs Java 7 simples: crie uma class HashMapBuilder com este método:

 public static HashMap build(String... data){ HashMap result = new HashMap(); if(data.length % 2 != 0) throw new IllegalArgumentException("Odd number of arguments"); String key = null; Integer step = -1; for(String value : data){ step++; switch(step % 2){ case 0: if(value == null) throw new IllegalArgumentException("Null key value"); key = value; continue; case 1: result.put(key, value); break; } } return result; } 

Use o método assim:

 HashMap data = HashMapBuilder.build("key1","value1","key2","value2");