Pregunta sobre java, collections – ¿Cómo uso los literales de colección en Java 7?

19

He intentado 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.

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

Ese truco depende del compilador en uso. Creo que funciona con Eclipse pero no con javac. Stuart Marks
En Java 8, puedes usar este truco para obtener literales de mapas razonables a partir de expresiones lambda:gist.github.com/galdosd/10823529 Domingo Ignacio
¡Los dos puntos se ven graciosos! :) user unknown

Tu respuesta

3   la respuesta
48

como se explica en esta pregunta:¿Las mejoras de la colección de Project Coin estarán en JDK8?

Puedes usar GoogleGuayaba Biblioteca si solo necesitas colecciones inmutables.ImmutableList, ImmutableSet yImmutableMap tienen 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 añadidométodos de recolección de la fábrica 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)
);
Oh, debería haberlo buscado. Es una pena, de verdad; Tenía muchas ganas de usar los literales de colección. ¡Gracias! DaedalusUsedPerl
0

z y debe crearse 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, 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 todavía se necesitan los pares clave-valor definidos en el lado de la asignación de la declaración. Entonces, me gustaría cambiar:

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

a

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
@lmsurprenant no puede usar <> con clases internas anónimas Jonas Alves
No, el operador <> se agregó en Java 1.7 como azúcar sintáctica, por lo que no necesita ser tan detallado. lmsurprenant
11

opcionalmente combinada con la inicialización de doble refuerzo:

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
  put(new Character('r'), Color.red);
  put(new Character('b'), Color.black );
}};
Hmm, si alguien califica una publicación hacia abajo, sería bueno obtener algún comentario por qué. Todos estamos aquí para aprender, ¿no? Thomas
Personalmente no te he rechazado, 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. Verstackoverflow.com/a/924536/581205 En segundo lugar, no tiene que crear manualmente una nueva instancia de Character, autoboxing lo hace por usted:put('r', Color.red); Natix
Sin embargo, debería usar valueOf en todas las clases nativas. stolsvik
@Natix sí, no se recomienda la inicialización de doble refuerzo, acabo de mencionarlo como una respuesta a la pregunta del OP. Es cierto que hay alternativas mucho mejores para lograrlo. Además de eso, creando unCharacter manualmente (boxeo manual) o el uso de autoboxing no es realmente una razón para una reducción de precio. Es una cuestión de estilo y traté de usar la mayor cantidad posible de código OP para mantener la confusión baja. Thomas
Me gusta este. Últimamente he visto un constructo similar en otros lugares, pero la gente sugirió nunca usar subclases anónimas para escribir literales. Estoy en desacuerdo. GhostCat

Preguntas relacionadas