2011-01-30 15 views
9

Me preguntaba si es posible definir el contenido de un objeto de mapa en la inicialización.¿Cómo se define el contenido del mapa en la inicialización?

Por ejemplo, una matriz se pueden crear, como:

new String[] {“apples”, “bananas”, “pears”} 

Por lo tanto, me preguntaba si hay algo similar que podemos hacer por los mapas.

+2

Estrechamente relacionado: http://stackoverflow.com/questions/507602/how-to-init ialise-a-static-map-in-java? rq = 1 – Jonik

Respuesta

24

Usted puede, más o menos, usando este truco sintaxis:

Map<String,String> map = new HashMap<String,String>() {{ 
    put("x", "y"); 
    put("a", "b"); 
}}; 

No es muy agradable, sin embargo. Esto crea una subclase anónima de HashMap y la rellena en el inicializador de instancias.

+0

Buen truco. Sin embargo, pondría esos {} internos en líneas separadas, ya que parece muy confuso en este momento. –

+0

@Sergey: claro, cualquiera que sea el estilo que prefiera. Sin embargo, siempre he usado este estilo, y cada vez que veo este truco, también usa este estilo. Te acostumbras. Lo importante es el inicializador, eso es lo que debe enfocarse. – skaffman

+0

ok, gracias chicos! – Larry

1

Puede utilizar bloques de inicializador:

class Foo { 
    //using static initializer block 
    static Map<String,String> m1 = new HashMap<String,String>(); 
    static { 
     m1.put("x","y"); 
     m1.put("a","b"); 
    }  

    //using initializer block 
    Map<String,String> m2 = new HashMap<String,String>(); 
    { 
     m2.put("x","y"); 
     m2.put("a","b"); 
    }  

} 
+0

Alguien señaló una vez que usar inicializadores de instancias en lugar de constructores es una mala idea, particularmente porque dificulta el manejo de excepciones. los inicializadores estáticos están bien, sin embargo. –

+0

@Sergey: Depende. Lea esto: http://stackoverflow.com/questions/1355810/how-is-an-instance-initializer-different-from-a-constructor –

+0

No pondría código propenso a errores en los inicializadores, pero para operaciones seguras como llenando colecciones no veo problemas. – Landei

15

Si su Map va a ser inmutable después de la creación y no le importa la adición de una dependencia, Guava ofrece algunas buenas fluidez syntax:

Map<K,V> aMap = ImmutableMap.<K,V>builder().put(key0, val0).put(key1,val1).build(); 

Si se siente realmente exótico, Scala tiene una sintaxis exactamente igual a la que desea y es interoperable con otros códigos Java:

val aMap = Map("a"->0, "b"->1) 

Tenga en cuenta que el compilador Scala inferirá el tipo genérico es MapString-Int, en base a lo que se pone en ella, aunque se puede especificar explícitamente que también.

Sin embargo, si esto es solo una vez, iría con la sintaxis basada en el inicializador. Tanto la biblioteca de Guava como el idioma de Scala tienen mucho más para recomendar, pero aprender una nueva biblioteca/lenguaje podría estar por la borda.

+0

+1 para la referencia de Scala :-) – Landei

0

Algo muy hacky..can ser mejorado, pero esto es sólo una dirección: Definir un ayudante estática para convertir una tabla de objeto a un mapa de este tipo:

public static<K,V> Map<K, V> fromArray(Object[] anObjArray){ 
    int size = anObjArray.length; 
    Map<K, V> aMap = new HashMap<K, V>(); 
    for (int i=0;i<=size/2;i=i+2){ 
     K key = (K)anObjArray[i]; 
     V value = (V)anObjArray[i+1]; 
     aMap.put(key, value); 
    } 
    return aMap; 
} 

continuación, puede crear un mapa el uso de este:

 Map<Integer, String> aMap = MapUtils.<Integer, String>fromArray(new Object[]{1, "one", 2,"two"}); 

lo haría personalmente segundo constructor sugerencia Gauva de @Carl aunque :-)

Cuestiones relacionadas