Maps unter Java mit computeIfAbsent nutzen

Wenn eine Map unter Java etwas komplexer wird, wie z.B. folgende Map:

Map<String, List<String>> testMap = new HashMap<>();

wird das befüllen derselbigen interessant. In diesem Beispiel soll ein Key und ein neuer Value für die Liste vom Typ String hinzugefügt werden. Damit dies funktioniert muss überprüft werden ob der Key bereits existiert und wenn dies nicht der Fall ist, ein neuer Key angelegt werden. Im kompletten Beispiel sieht das Ganze so aus:

String key = "ABC";
String valueForList = "DEF";

Map<String, List<String>> testMap = new HashMap<>();

if(!testMap.containsKey(key)) {
    testMap.put(key, new ArrayList<>());
} 

testMap.get(key).add(valueForList);

Einfacher und unkomplizierter ist es die Methode computeIfAbsent zu nutzen, welche seit Java 8 in der Definition des Map-Interfaces enthalten ist. Mit der Nutzung der Methode verkürzt sich das Beispiel wie folgt:

String key = "ABC";
String valueForList = "DEF";

Map<String, List<String>> testMap = new HashMap<>();
testMap.computeIfAbsent(key, s -> new ArrayList<>()).add(valueForList);

Damit wird automatisch eine neue ArrayList angelegt, wenn der entsprechende Schlüssel noch nicht hinterlegt ist. Anschließend kann der entsprechende Wert für die Liste hinzugefügt werden.

2 Kommentare » Schreibe einen Kommentar

  1. Wieso verbreitest Du seit Tagen schlechten Java Code und heute auch noch FALSCHEN ?

    Das muß natürlich -> !…containsKey(…) lauten, sonst macht das keinen Sinn.

    und zu der Programmiertechnik : …blah.add().add().compute();
    sei angemerkt, daß sie das Equivalent zu „ich kann das, ich kann das… oh kaputt“ ist. Wenn nämlich eins der Adds failed (in meinem Beispiel) dann fängt das niemand ab und der ganze Codeblock crasht weg. Und das nur um vermeindlich ein paar Anweisungen zusparen. Hängt da mal 10 adds dran und sag mir später welchescdabon gecrasht ist. Wie jetzt, geht nicht ?

    • Das mit dem fehlenden Operator ist natürlich korrekt; ich habe das mal korrigiert.

      Zu dem Rest sei gesagt das jede Variante ihre Vor- und Nachteile hat. Warum das per Definition schlecht sein soll, erschließt sich mir ehrlich gesagt nicht.

      Außerdem habe ich in dem Beispiel keine Variante beschrieben, in welcher mehrere add-Methoden nacheinander genutzt werden. Deshalb ist das konstruierte Problem für mich und diesen Beitrag keines, weil ich einen solchen Quellcode nicht schreiben würde.

Schreibe einen Kommentar zu seeseekey Antworten abbrechen

Pflichtfelder sind mit * markiert.