Frage an collections, java – Wie verwende ich Sammlungsliterale in Java 7?

19

Ich habe die folgende Zeile ausprobiert:

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

Netbeans 7 weist dies jedoch mit der Fehlermeldung zurück'{' expected, ';' expected.

Ich habe das Quell- / Binärformat auf "JDK 7" und die Plattform auf "JDK 1.7" eingestellt. Muss ich noch etwas tun?

Die Doppelpunkte sehen lustig aus! :) user unknown
In Java 8 können Sie diesen Trick verwenden, um vernünftige Kartenliterale aus Lambda-Ausdrücken zu erhalten:gist.github.com/galdosd/10823529 Domingo Ignacio
Dieser Trick hängt vom verwendeten Compiler ab. Ich denke, es funktioniert mit Eclipse, aber nicht mit Javac. Stuart Marks

Deine Antwort

3   die antwort
11

optional kombiniert mit einer doppelten geschweiften Klammer:

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
  put(new Character('r'), Color.red);
  put(new Character('b'), Color.black );
}};
Hmm, wenn jemand einen Beitrag herunterschätzt, wäre es nett, ein Feedback zu bekommen, warum. Wir sind alle hier, um zu lernen, nicht wahr? Thomas
Ich persönlich habe Sie nicht abgewählt, aber ich sehe zwei Probleme mit Ihrem Code. Erstens ist das Erstellen einer anonymen Unterklasse nur zur Initialisierung keine sehr gute Vorgehensweise. Sehenstackoverflow.com/a/924536/581205 Zweitens müssen Sie keine neue Character-Instanz manuell erstellen. Autoboxing erledigt dies für Sie:put('r', Color.red); Natix
@ Natix ja, die doppelte Klammer-Initialisierung ist nicht wirklich zu empfehlen. Ich habe sie nur als Antwort auf die Frage des OP erwähnt. Es ist wahr, dass es viel bessere Alternativen gibt, um dies zu erreichen. Außerdem schaffen einCharacter manuell (manuelles boxen) oder autoboxen ist eigentlich kein grund für eine downrate. Es ist eine Frage des Stils und ich habe versucht, so viel wie möglich vom OP-Code zu verwenden, um die Verwirrung gering zu halten. Thomas
Sollte jedoch valueOf für alle nativen Klassen verwenden. stolsvik
Ich mag dieses. Ich habe in letzter Zeit ein ähnliches Konstrukt an anderer Stelle gesehen, aber dort wurde vorgeschlagen, niemals anonyme Unterklassen zu verwenden, um Literale aufzuschreiben. Ich stimme dir nicht zu. GhostCat
48

wie in dieser Frage erläutert:Werden die Sammlungserweiterungen von Project Coin in JDK8 verfügbar sein?

Sie können Google verwendenGuave Bibliothek, wenn Sie nur unveränderliche Sammlungen benötigen.ImmutableList, ImmutableSet undImmutableMap Es gibt mehrere überladene Factory-Methoden oder sogar Builder, die das Erstellen von Sammlungen vereinfachen:

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");

BEARBEITEN

Java 9 wurde hinzugefügtMethoden der Sammelfabrik ähnlich denen von Guave:

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, ich hätte es nachschlagen sollen. Es ist wirklich eine Schande; Ich freute mich darauf, Sammlungsliterale zu verwenden. Vielen Dank! DaedalusUsedPerl
0

Antwort ein wenig zu erläutern ... Map ist eine Schnittstelle und muss über eine der zugehörigen konkreten Implementierungen (HashMap, TreeMap oder LinkedHashMap) instanziiert werden. Es ist immer noch eine gute Praxis; Deklarieren Sie Ihre Referenzvariable jedoch als Schnittstellenimplementierung und nicht als konkrete Variable, da dies zukünftige Flexibilität bietet.

In Bezug auf das Code-Snippet brauchst du allerdings immer noch die Schlüssel-Wert-Paare, die auf der Zuweisungsseite der Deklaration definiert sind. Also würde ich ändern:

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

zu

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
@lmsurprenant Sie können <> nicht mit anonymen inneren Klassen verwenden Jonas Alves
Nein, der Operator <> wurde in Java 1.7 als syntaktischer Zucker hinzugefügt, sodass Sie nicht so ausführlich sein müssen. lmsurprenant

Verwandte Fragen