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);
3 Réponses :
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);
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é.
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)
Pour ceux qui ne connaissent pas la méthode merge
:
countMap.put(key, countMap.getOrDefault(key,0)+1);
Regardez 'computeIfAbsent', qui fait partie de l'interface Map
Une autre variante
countMap.put (key, countMap.containsKey (key)? CountMap.get (key) + 1: 1);