2017-02-03 22 views
9

Mam java.util.Map<Foo, Double> dla klasy kluczowej Foo. Nazwijmy instancję mapy map.Umieszczenie nowej wartości w mapie, jeśli nie jest ona dostępna, lub dodanie jej, jeśli jest to

chcę dodać {foo, f} (foo jest instancją Foo i fDouble) na tej mapie. Ale jeśli klucz foo jest już dostępny, chcę podsumować f do bieżącej wartości na tej mapie.

Obecnie używam

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

Ale jest tam ostry sposób to zrobić w Java 8, takie jak wykorzystanie Map#merge i Double::sum?

Niestety nie mogę tego rozgryźć.

Dziękuję.

Odpowiedz

14

to właśnie służy funkcja scalania na mapach.

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

ta może być zmniejszona nawet dalej do

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

to jest w zasadzie odpowiednikiem

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

To jest cudowne. Dokładnie to, czego chciałem. Dziękuję Ci. –

5

można zrobić:

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

Wartośćtu będzie taki, który odpowiada foo jeśli obecne w Map lub 0d, inaczej.

+1

To mała rzecz, ale to robi dwa wyszukiwania na mapie. Ale nadal głosuję na to. –

+1

Gdzie ma miejsce dodawanie z 'f'? –

+1

@ AndréStannek, nie jadłem dziś rano śniadania i przypadkowo zjadłem 'f'. :) –

-1

Poniżej fragment kodu zaktualizować wartość C, dodać nowy wpis 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()));