Necesito inicializar un HashMap constante y me gustaría hacerlo en una declaración de línea. Evitando algo como esto:
hashMap.put("One", new Integer(1)); // adding value into HashMap
hashMap.put("Two", new Integer(2));
hashMap.put("Three", new Integer(3));
similar a esto en el 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]
No he encontrado ningún ejemplo que muestre cómo hacer esto después de haber visto tantos.
Puede usar ImmutableMap de Google Guava. Esto funciona siempre que no te importe modificar el Mapa más tarde (no puedes llamar a .put () en el mapa después de construirlo usando este método):
Ver también: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html
Una pregunta algo relacionada: ¿ Solución alternativa de ImmutableMap.of () para HashMap en Maps?
fuente
ImmutableMap
no aceptanull
claves o valores.Desde Java 9, es posible usar
Map.of(...)
, así:Este mapa es inmutable. Si desea que el mapa sea mutable, debe agregar:
Si no puede usar Java 9, tiene que escribir un método auxiliar similar usted mismo o usar una biblioteca de terceros (como Guava ) para agregar esa funcionalidad por usted.
fuente
Map.of
solo se realizan hasta 10 entradas ya que es bastante laboriosoJava no tiene un mapa literal, por lo que no hay una buena manera de hacer exactamente lo que está pidiendo.
Si necesita ese tipo de sintaxis, considere algunos Groovy, que es compatible con Java y le permite hacer:
fuente
Los mapas también han agregado métodos de fábrica en Java 9. Para hasta 10 entradas, los mapas han sobrecargado a los constructores que toman pares de claves y valores. Por ejemplo, podríamos construir un mapa de varias ciudades y sus poblaciones (según Google en octubre de 2016) de la siguiente manera:
El caso de var-args para Map es un poco más difícil, necesita tener claves y valores, pero en Java, los métodos no pueden tener dos parámetros var-args. Entonces, el caso general se maneja tomando un método var-args de
Map.Entry<K, V>
objetos y agregando unentry()
método estático que los construya. Por ejemplo:Métodos de Factory Factory en Java 9
fuente
Aquí hay una clase simple que logrará lo que quieres
Y luego usarlo
Esto produce
{a:1, b:2}
fuente
Ignorando la declaración de
x
(que es necesaria para evitar un diagnóstico de "declaración inalcanzable"), técnicamente es solo una declaración.fuente
Puede agregar esta función de utilidad a una clase de utilidad:
Nota: en
Java 9
puedes usar Map.offuente
Otro enfoque puede ser escribir una función especial para extraer todos los valores de los elementos de una cadena por expresión regular:
fuente