¿Cómo uso los literales de colección en Java 7?

He probado la siguiente línea:

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.

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

preguntado el 22 de mayo de 12 a las 17:05

En Java 8, puede usar este truco para obtener literales de mapas razonables a partir de expresiones lambda: gist.github.com/galdosd/10823529 -

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

3 Respuestas

Ni Java 7 ni Java 8 admiten literales de colección, como se explica en esta pregunta: ¿Las mejoras de la colección de Project Coin estarán en JDK8?

Puedes usar Google's Guayaba biblioteca si solo necesita colecciones inmutables. ImmutableList, ImmutableSet y ImmutableMap tener varios métodos de fábrica sobrecargados o incluso constructores que facilitan la creación de colecciones:

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 ha agregado métodos de fábrica de recolección similares a las 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)
);

respondido 21 mar '18, 23:03

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

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

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

contestado el 22 de mayo de 12 a las 20:05

Hmm, si alguien califica negativamente una publicación, sería bueno recibir comentarios sobre por qué. Todos estamos aquí para aprender, ¿no? - Thomas

Personalmente, no te voté en contra, pero veo dos problemas con tu código. Primero, crear una subclase anónima solo para la inicialización no es una buena práctica. Ver stackoverflow.com/a/924536/581205 En segundo lugar, no tiene que crear manualmente una nueva instancia de personaje, el autoboxing lo hace por usted: put('r', Color.red); - Natix

@Natix sí, la inicialización de doble llave no se recomienda realmente. Solo la mencioné como respuesta a la pregunta del OP. Es cierto que hay alternativas mucho mejores para lograrlo. Además de eso, crear un Character manualmente (boxeo manual) o usar autoboxing no es realmente una razón para una rebaja. Es una cuestión de estilo y traté de usar la mayor cantidad posible del código del OP para mantener baja la confusión. - Thomas

Sin embargo, debería usar valueOf en todas las clases nativas. - Stolsvik

Me gusta este. Últimamente he visto una construcción similar en otros lugares, pero allí la gente sugirió nunca usar subclases anónimas para escribir literales. Estoy en desacuerdo. - gato fantasma

Para ampliar un poco la respuesta de Thomas... El mapa es una interfaz y debe crearse una instancia a través de una de las implementaciones concretas asociadas (HashMap, TreeMap o LinkedHashMap). Sigue siendo una buena práctica; sin embargo, para declarar su variable de referencia como la implementación de la interfaz en lugar del concreto específico, ya que proporciona flexibilidad futura.

Sin embargo, con respecto al fragmento de código, creo que aún necesita los pares clave-valor definidos en el lado de la asignación de la declaración. Entonces, cambiaría:

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

a

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

contestado el 22 de mayo de 12 a las 17:05

No, el operador <> se agregó en Java 1.7 como azúcar sintáctico, por lo que no necesita ser tan detallado. - lmsurprenant

@lmsurprenant no puede usar <> con clases internas anónimas - jonas alves

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.