Hashmap, wie prüfe ich ob ein Key schon existiert

berserkerdq2

Bekanntes Mitglied
Hi, ich habe eine Hashmap<String,Integer>, ich soll hier einen Eintrag erstellen, zuvor soll ich jedoch prüfen, ob der key schon exisitiert. Wenn z. B. der String "München" als Key schon existiert, soll ich auf den zugreifen und den Integerwert nur erhöhen, wenn München noch nicht existiert, soll ich München neu einfügen und den Integerwert setzen, aber wie mache ich das?
 
Wenn z. B. der String "München" als Key schon existiert, soll ich auf den zugreifen und den Integerwert nur erhöhen, wenn München noch nicht existiert, soll ich München neu einfügen und den Integerwert setzen
Hierfür eignet sich auch gut Map.merge():
Java:
Map<String, Integer> map = new HashMap<>();
map.put("Hamburg", 3);
map.merge("München", 1, Integer::sum);
map.merge("Hamburg", 1, Integer::sum);
System.out.println(map);
 
aber wie mache ich das?
Java:
import java.util.HashMap;

public class SpassMitHashMap {
    private HashMap<String, Integer> map = new HashMap<>();

    public void countUp(String key) {
        if (!map.containsKey(key)) {
            map.put(key, 0);
        }
        map.put(key, map.get(key) + 1);
    }

    public static void main(String[] args) {
        SpassMitHashMap smhm = new SpassMitHashMap();
        smhm.countUp("München");
        smhm.countUp("München");
        smhm.countUp("München");
        smhm.countUp("Münster");
        System.out.println(smhm.map);
    }
}
 
Ist das kein Lambda? map.merge("München", 1, Integer::sum);
Das ist kurz für map.merge("München", 1, (a,b) -> Integer.sum(a, b)); Ich dachte immer das entspricht der Implementierung eines Lambdas für eine BiFunction.
ein lambda kreiert eine anonyme klasse die das interface implementiert

das Integer::sum ist eine methoden referenz die keine klasse implementiert... gab mal vor kurzem eine diskussion drüber
 
Hm. Hier https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html steht:

You use lambda expressions to create anonymous methods. Sometimes, however, a lambda expression does nothing but call an existing method. In those cases, it's often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.
Also schon irgendwie lambda expression... 😉
 
Danke! Die anonyme Klasse ist falsch das war mir schon klar. Mir aber war nicht klar, dass es nicht einfach nur eine verkürzte Schreibweise ist. Da benutzt man das jeden Tag ... 🤦‍♂️
 
Frag ich mich auch. Ich find die ausgesprochen praktisch, ausgelagerte (und hoffentlich sauber benannte) Methoden anstatt Lambda im Codeteil mit den Zuweisungen. Viel einfacher nachzuvollziehen. Aber selbst bei einfachen Anweisungen gibt es Vorteile. Man vergleiche mal die Schreibweisen:
Java:
myStream.filter(Objects::nonNull).....;
//liest sich doch viel geschmeidiger als die herkömmliche Schreibweise
myStream.filter(e -> e != null).....;
//oder
myStream.filter(e -> Objects.nonNull(e)).....;


//anderes Beispiel
.forEach(e -> myConsumer.accept(e))
//oder doch lieber
.forEach(myConsumer::accept)


//noche eines für Unterwegs
.addItemListener(e -> handleMyItemEvent(e))
//oder doch lieber
.addItemListener(this::handleMyItemEvent)
 

Zurück
Oben