2
votes

Existe-t-il quelque chose comme getOrDefault lors de la mise d'une valeur dans la carte java8?

En java8, lors de l'obtention de la valeur d'une carte, nous pouvons écrire:

if(countMap.keySet().contains(key)){
    countMap.put(key,countMap.get(key)+1);
}else{
    countMap.put(key,1);
}

qui est égal à:

if(countMap.contains(key)){
    keyCount=countMap.get(key);
}else{
    keyCount=0;
}

Problème est-ce qu'il existe un moyen élégant de remplacer les codes ci-dessous:

int keyCount=countMap.getOrDefault(key,0);


2 commentaires

Regardez 'computeIfAbsent', qui fait partie de l'interface Map


Une autre variante countMap.put (key, countMap.containsKey (key)? CountMap.get (key) + 1: 1);


3 Réponses :


0
votes

Vous recherchez le méthode compute , également ajoutée dans Java 8. Cette méthode prend la clé que vous utilisez, ainsi que une BiFunction pour calculer ce que devrait être la nouvelle valeur, en fonction de la clé et de la valeur existante. Donc, dans votre cas, il aimerait quelque chose comme ce qui suit:

    countMap.compute(key, this::incrementOrSetToOne);

    // ... some other code ...

    private Integer incrementOrSetToOne(KeyType key, Integer oldValue) {
        return oldValue == null ? 1 : oldValue + 1;
    }

Lorsque la clé que vous donnez n'existe pas encore dans la carte, la valeur oldValue dans la BiFunction sera être nul ; si vous renvoyez null dans la BiFunction , rien n'est mis dans la carte.

Il faut un peu de temps pour s'y habituer, mais c'est une méthode très puissante une fois que vous avez compris. Il peut être plus lisible (bien que beaucoup plus verbeux) avec une référence de méthode au lieu du lambda en ligne:

countMap.compute(key, (k, oldValue) -> oldValue == null ? 1 : oldValue + 1);


2 commentaires

Il est encore plus simple d’utiliser countMap.merge (key, 1, Integer :: sum)


@Holger Oui, ça l'est. J'oublie toujours la fusion . Merci de l'avoir noté.



2
votes

Comme Holger l'a également mentionné, vous pouvez simplement utiliser Map.merge comme:

V oldValue = map.get(key);
V newValue = (oldValue == null) ? value :
             remappingFunction.apply(oldValue, value);
if (newValue == null)
    map.remove(key);
else
    map.put(key, newValue);

Notez que la documentation indique également son implémentation:

L'implémentation par défaut équivaut à effectuer les étapes suivantes pour cette carte, puis à renvoyer la valeur actuelle ou null si elle est absente:

countMap.merge(key, 1, Integer::sum)


0 commentaires

0
votes

Pour ceux qui ne connaissent pas la méthode merge :

countMap.put(key, countMap.getOrDefault(key,0)+1);


0 commentaires