O Guava nos fornece ótimos métodos de fábrica para tipos Java, como Maps.newHashMap()
.
Mas também existem construtores para mapas java?
HashMap<String,Integer> m = Maps.BuildHashMap.
put("a",1).
put("b",2).
build();
java
collections
guava
Elazar Leibovich
fonte
fonte
Respostas:
Uma vez que a
Map
interface Java 9 contém:Map.of(k1,v1, k2,v2, ..)
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ..)
.As limitações desses métodos de fábrica são:
null
s como chaves e / ou valores (se você precisar armazenar nulos, dê uma olhada em outras respostas)Se precisarmos de um mapa mutável (como HashMap), podemos usar seu construtor de cópia e deixá-lo copiar o conteúdo do mapa criado via
Map.of(..)
fonte
null
valores, o que pode ser um problema dependendo do caso de uso.Map.of(k1,v1, k2,v2, ...)
pode ser usado com segurança quando não temos muitos valores. Para uma quantidade maior de valoresMap.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
nos dá um código mais legível que é menos sujeito a erros (a menos que eu tenha entendido mal).Não existe tal coisa para HashMaps, mas você pode criar um ImmutableMap com um construtor:
E se você precisar de um mapa mutável, basta alimentá-lo para o construtor HashMap.
fonte
ImmutableMap
não suportanull
valores. Portanto, há uma limitação dessa abordagem: você não pode definir valores em seuHashMap
paranull
.new HashMap
construtor Java em vez doMaps.newHashMap
método estático ?Não é bem um construtor, mas usa um inicializador:
fonte
map instanceof HashMap
falso? Parece uma ideia não muito boa.map.getClass()==HashMap.class
retornará falso. Mas isso é um teste estúpido de qualquer maneira.HashMap.class.isInstance(map)
deve ser preferido, e isso retornará verdadeiro.Isso é semelhante à resposta aceita, mas um pouco mais clara, a meu ver:
Existem várias variações do método acima e são ótimas para fazer mapas estáticos, imutáveis e imutáveis.
fonte
Aqui está um muito simples ...
então
Consulte https://gist.github.com/culmat/a3bcc646fa4401641ac6eb01f3719065
fonte
Um construtor de mapa simples é fácil de escrever:
fonte
Você pode usar:
Não é tão elegante e legível, mas faz o trabalho.
fonte
Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
, Melhor?HashMap
é mutável; não há necessidade de um construtor.fonte
ImmutableSet
. Se você realmente quiser que ele seja mutável, pode inicializá-lo no construtor ou em um bloco inicializador de instância ou em um bloco inicializador estático, se for um campo estático.ImmutableMap
lá obviamente.{{init();}}
não estática (não no construtor, já que outro construtor pode esquecê-la). E é bom que seja uma espécie de ação atômica. Se o mapa for volátil, inicializá-lo com um construtor garante que ele esteja semprenull
no estado final, nunca preenchido pela metade.Você pode usar a API fluente nas coleções do Eclipse :
Aqui está um blog com mais detalhes e exemplos.
Nota: Eu sou um committer para Eclipse Collections.
fonte
Eu tinha um requisito semelhante há um tempo. Não tem nada a ver com goiaba, mas você pode fazer algo assim para ser capaz de construir um
Map
usando um construtor fluente.Crie uma classe base que estenda Map.
Em seguida, crie o construtor fluente com métodos que atendam às suas necessidades:
Você pode então implementá-lo assim:
fonte
Isso é algo que eu sempre quis, especialmente durante a configuração de acessórios de teste. Finalmente, decidi escrever um construtor fluente simples que pudesse construir qualquer implementação de mapa - https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java
fonte
Aqui está um que escrevi
Você o usa assim:
fonte
Usando java 8:
Esta é uma abordagem do Java-9
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
Como usar:
fonte
Tem
ImmutableMap.builder()
na Goiaba.fonte
Underscore-java pode construir hashmap.
fonte