Java 9: Collections komfortabler initialisieren

Viele Programmiersprachen kennen bequeme Kurzschreibweisen zur Initialisierung von Maps, Sets etc. In Java gibt’s das leider nur für Arrays (also int [] x = {1, 2, 3}). Daran wird auch Java 9 nichts ändern, JEP186 wurde vorerst verworfen. Aber immerhin wurde stattdessen JEP269 implementiert. Dieser Erweiterungsvorschlag sieht die neue Methoden List.of, Set.of und Map.of vor, mit denen sich Collections recht komfortabel initialisieren lassen. (JEP = JDK Enhancement Proposals).

Sets

Wenn Sie in der Vergangenheit einfache Beispiele mit Listen, Sets oder Maps machen wollten, mussten Sie zuerst recht umständlich diese Collections initialisieren — beispielsweise so:

import java.util.*;
...
Set<Integer> s = new HashSet<>();
s.add(1);
s.add(12);
s.add(23);
s.stream().forEach( n -> System.out.println(n) );
// Ausgabe: 1, 23, 12  (in zufälliger Reihenfolge, weil Set!)

In Java 9 geht das komfortabler:

Set<Integer> s = Set.of(1, 12, 23);
s.stream().forEach( n -> System.out.println(n) );
// Ausgabe: 1, 23, 12  (in zufälliger Reihenfolge)

Dabei ist zu beachten, dass die beiden Code-Beispiele nicht ganz gleichwertig sind. Im ersten Beispiel liegt ein veränderliches HashSet vor, das später noch manipuliert werden kann. Set.of(...) erzeugt hingegen ein unveränderliches Set (intern: Collections.unmodifiableSet). Für einfache Beispiele wie dem obigen ist das egal, aber wenn Ihr Programm das Set später erweitern muss, ist Set.of(...) nicht geeignet.

Listen

Analog können Sie auch Listen initialisieren:

List<String> l = List.of("Hello", "World,", "Java 9!");
l.stream().forEach( s -> System.out.print(s + " ") );
System.out.println();
// Ausgabe: Hello World, Java 9! 

Maps

Bei Maps gibt es zwei Möglichkeiten. Die erste ist wieder die of-Methode, wobei die Daten abwechselnd als Key und Value übergeben werden, also z.B. so:

// max. 10 Key-Value-Paare
Map<String, Integer> m = Map.of("eins", 1, "zwei", 2, "drei", 3);
System.out.println(m.get("zwei"));  // Ausgabe 2

Diese Schreibweise funktioniert bis zu max. 20 Parameter (also 10 Key-Value-Paare).

import java.util.*;
import static java.util.Map.entry;
...
// beliebig viele Key-Value-Paare, erfordert den obigen
// Import von java.util.Map.entry
Map<String, Integer> m =
  Map.ofEntries(entry("eins", 1),
                entry("zwei", 2),
                entry("drei", 3));
System.out.println(m.get("zwei"));  // Ausgabe 2

Links