2012-05-22 10 views
15

que he probado la siguiente línea:¿Cómo uso los literales de colección en Java 7?

Map<Character, Color> map={new Character('r'):Color.red,new Character('b'):Color.black}; 

Pero Netbeans 7 rechaza esto, con el mensaje de error '{' expected, ';' expected.

He establecido el formato Fuente/Binario como 'JDK 7' y la plataforma como 'JDK 1.7', ¿hay algo más que deba hacer?

+0

Los dos puntos mirada divertida! :) –

+0

En Java 8, puede usar este truco para sacar literals de mapas razonables de expresiones lambda: https://gist.github.com/galdosd/10823529 –

+2

Ese truco depende del compilador en uso. Creo que funciona con Eclipse pero no con javac. –

Respuesta

44

Java 7 no admite literales de colecciones. Ellos están previstas para Java 8. Ellos no lo hacen, incluso en Java 8 como se discute en esta pregunta: Are Project Coin's collection enhancements going to be in JDK8?

Puede utilizar la biblioteca de Google Guava si necesita sólo colecciones inmutables. ImmutableList, ImmutableSet y ImmutableMap tienen varios métodos de fábrica sobrecargados o incluso constructores que hacen que la creación de colecciones fácil:

List<Integer> list = ImmutableList.of(1, 1, 2, 3, 5, 8, 13, 21); 
Set<String> set = ImmutableSet.of("foo", "bar", "baz", "batman"); 
Map<Integer, String> map = ImmutableMap.of(1, "one", 2, "two", 3, "three"); 

EDITAR

Java 9 probablemente añadir collection factory methods similares a los de guayaba:

List.of(a, b, c); 
Set.of(d, e, f, g); 
Map.of(k1, v1, k2, v2) 

Map.ofEntries(
    entry(k1, v1), 
    entry(k2, v2), 
    entry(k3, v3), 
    // ... 
    entry(kn, vn) 
); 
+1

Oh, debería haberlo buscado. Es una pena, realmente; Tenía muchas ganas de usar literales de colección. ¡Gracias! – DaedalusUsedPerl

10

Debe definir una implementación de mapa concreta, opcionalmente combinada con inicialización de llave doble:

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
    put(new Character('r'), Color.red); 
    put(new Character('b'), Color.black); 
}}; 
+1

Hmm, si alguien califica una publicación, sería bueno obtener algún comentario sobre por qué. Estamos todos aquí para aprender, ¿verdad? – Thomas

+7

Personalmente no te voté de forma negativa, pero veo dos problemas con tu código. Primero, crear una subclase anónima solo para la inicialización no es una muy buena práctica. Ver http://stackoverflow.com/a/924536/581205 Segundo, no tienes que crear manualmente una nueva instancia de personaje, el autoboxing hace eso por ti: 'put ('r', Color.red);' – Natix

+7

@ Natix sí, la inicialización del doble refuerzo no es realmente recomendable. Simplemente lo mencioné como una respuesta a la pregunta del OP. Es cierto que hay alternativas mucho mejores para lograr eso. Además de eso, crear un 'Character' manualmente (boxeo manual) o usar el autoboxing no es realmente una razón para un downrate. Es una cuestión de estilo y traté de utilizar la mayor cantidad de código OP posible para mantener la confusión baja. – Thomas

0

Para ampliar un poco sobre la respuesta de Thomas ... Mapa es una interfaz, y debe ser una instancia a través de una de las implementaciones concretas asociadas (HashMap, TreeMap o LinkedHashMap). Todavía es una buena práctica; sin embargo, para declarar su variable de referencia como la implementación de la interfaz en lugar de la concreción específica, ya que proporciona flexibilidad en el futuro.

Sin embargo, en relación con el fragmento de código, creo que todavía necesita los pares clave-valor definidos en el lado de la asignación de la declaración. Por lo tanto, me gustaría cambiar:

Map<Character, Color> map = new HashMap<>() {{ 

a

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
+4

No, el operador <> se agregó en Java 1.7 como azúcar sintáctico, por lo que no es necesario que sea tan detallado. – lmsurprenant

+3

@lmsurprenant no puede usar <> con clases internas anónimas –

Cuestiones relacionadas