Guava nos proporciona excelentes métodos de fábrica para tipos de Java, como Maps.newHashMap()
.
¿Pero también hay constructores para Java Maps?
HashMap<String,Integer> m = Maps.BuildHashMap.
put("a",1).
put("b",2).
build();
java
collections
guava
Elazar Leibovich
fuente
fuente
Respuestas:
Dado que la
Map
interfaz de Java 9 contiene:Map.of(k1,v1, k2,v2, ..)
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ..)
.Las limitaciones de esos métodos de fábrica son que:
null
s como claves y / o valores (si necesita almacenar nulos, eche un vistazo a otras respuestas)Si necesitamos un mapa mutable (como HashMap), podemos usar su constructor de copia y dejar que copie el contenido del mapa creado a través de
Map.of(..)
fuente
null
valores, lo que puede ser un problema según el caso de uso.Map.of(k1,v1, k2,v2, ...)
se puede utilizar de forma segura cuando no tenemos muchos valores. Para una mayor cantidad de valores,Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
nos da un código más legible que es menos propenso a errores (a menos que te haya entendido mal).No existe tal cosa para HashMaps, pero puede crear un ImmutableMap con un constructor:
Y si necesita un mapa mutable, puede simplemente enviarlo al constructor HashMap.
fuente
ImmutableMap
no admitenull
valores. Por lo tanto, hay una limitación de este enfoque: no puede establecer valores en suHashMap
tonull
.new HashMap
constructor de Java en lugar delMaps.newHashMap
método estático ?No es un constructor, pero usa un inicializador:
fuente
map instanceof HashMap
falso? Parece una idea no tan buena.map.getClass()==HashMap.class
devolverá falso. Pero esa es una prueba estúpida de todos modos.HashMap.class.isInstance(map)
debería ser preferido, y eso volverá verdadero.Esto es similar a la respuesta aceptada, pero un poco más limpia, en mi opinión:
Hay varias variaciones del método anterior y son excelentes para hacer mapas estáticos, inmutables e inmutables.
fuente
Aquí hay uno muy simple ...
luego
Ver https://gist.github.com/culmat/a3bcc646fa4401641ac6eb01f3719065
fuente
Un simple constructor de mapas es trivial de escribir:
fuente
Puedes usar:
No es tan elegante y legible, pero funciona.
fuente
Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
, ¿mejor?HashMap
es mutable; no hay necesidad de constructor.fuente
ImmutableSet
. Si realmente desea que sea mutable, puede inicializarlo en el constructor o en un bloque inicializador de instancia o en un bloque inicializador estático si es un campo estático.ImmutableMap
eso obviamente.{{init();}}
no estática (no en el constructor, ya que otro constructor podría olvidarlo). Y es bueno que sea una especie de acción atómica. Si el mapa es volátil, al inicializarlo con un constructor, asegúrese de que siempre esténull
o en el estado final, nunca a la mitad.Puede utilizar la API fluida en Eclipse Collections :
Aquí hay un blog con más detalles y ejemplos.
Nota: Soy un comprometido con las colecciones de Eclipse.
fuente
Hace un tiempo tuve un requisito similar. No tiene nada que ver con Guava, pero puedes hacer algo como esto para poder construir limpiamente
Map
usando un constructor fluido.Cree una clase base que amplíe Map.
Luego, cree el constructor fluido con métodos que se adapten a sus necesidades:
Luego puede implementarlo así:
fuente
Esto es algo que siempre quise, especialmente al configurar dispositivos de prueba. Finalmente, decidí escribir un constructor sencillo y fluido propio que pudiera construir cualquier implementación de mapa: https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java
fuente
Aquí hay uno que escribí
Lo usas así:
fuente
Usando java 8:
Este es un enfoque de Java-9
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
Cómo utilizar:
fuente
Hay
ImmutableMap.builder()
en Guayaba.fuente
Underscore-java puede crear hashmap.
fuente