2017-02-03 1 views
9

J'ai un java.util.Map<Foo, Double> pour une classe de clé-type Foo. Appelons l'instance de la carte map.Mettre une nouvelle valeur dans une carte si elle n'est pas présente, ou l'ajouter si elle est

Je veux ajouter {foo, f} (foo est une instance de Foo et f un Double) à cette carte. Mais si la clé foo est déjà présente, je veux additionner f à la valeur actuelle de cette carte.

Actuellement j'utilise

Double current = map.get(foo); 
f += current == null ? 0.0 : current; 
map.put(foo, f); 

Mais est-il un moyen génial de le faire en Java 8, comme l'utilisation Map#merge et Double::sum?

Malheureusement, je ne peux pas comprendre.

Merci.

Répondre

14

C'est la fonction de fusion sur les cartes.

map.merge(foo, f, (f1, f2) -> f1 + f2) 

cela peut être réduit encore davantage pour

map.merge(foo, f, Double::sum) 

il est essentiellement l'équivalent de

if(map.contains(foo)){ 
    double x = map.get(foo); 
    map.put(foo, x + f) 
} else { 
    map.put(foo, f)  
} 
+1

C'est merveilleux. Exactement ce que je voulais. Je vous remercie. –

5

Vous pouvez faire:

map.put(foo, f + map.getOrDefault(foo, 0d)); 

La valeur ici sera celui qui correspond à foo si elles sont présentes dans le Map ou 0d, sinon.

+1

C'est une petite chose, mais cela ne fait que deux recherches sur la carte. Mais je vote encore ceci. –

+1

D'où vient l'addition de 'f'? –

+1

@ AndréStannek, je n'avais pas pris mon petit déjeuner ce matin et j'ai accidentellement mangé le 'f'. :) –

-1

Ci-dessous l'extrait de code mettre à jour la valeur de c, ajouter une nouvelle entrée D.

map.put("A", 1.0); 
    map.put("B", 2.0); 
    map.put("C", 3.0); 
    double val = 0.25; 
    map.compute("C", (s,d)->d==null? 0 : d+val); 
    map.compute("D", (s,d)->d==null? 0 : d+val); 
    map.entrySet().forEach(e->System.out.println("k:"+e.getKey() + " ,value:"+e.getValue()));