2017-02-03 13 views
9

Tôi có một java.util.Map<Foo, Double> cho loại khóa loại Foo. Hãy gọi ví dụ của bản đồ map.Đặt một giá trị mới vào Bản đồ nếu không có hoặc thêm vào nếu nó là

Tôi muốn thêm {foo, f} (foo là một thể hiện của Foo, và f một Double) vào bản đồ đó. Nhưng nếu khóa foo đã có mặt, tôi muốn tổng hợp f với giá trị hiện tại trong bản đồ đó.

Hiện nay tôi sử dụng

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

Nhưng có một cách sôi nổi để làm điều này trong Java 8, chẳng hạn như sử dụng Map#merge, và Double::sum?

Đáng tiếc là tôi không thể tìm ra.

Cảm ơn bạn.

Trả lời

14

đây là chức năng hợp nhất trên bản đồ.

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

này có thể giảm hơn nữa để

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

nó về cơ bản là tương đương với

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

Điều này thật tuyệt vời. Chính xác những gì tôi muốn. Cảm ơn bạn. –

5

Bạn có thể làm:

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

Các giá trị đây sẽ là một trong đó tương ứng với foo nếu hiện diện trong Map hoặc 0d, nếu không.

+1

Đó là một việc nhỏ nhưng điều đó hai tra cứu trên bản đồ. Nhưng tôi vẫn bỏ phiếu này. –

+1

Việc bổ sung với 'f' diễn ra ở đâu? –

+1

@ AndréStannek, sáng nay tôi không ăn sáng và tôi vô tình ăn 'f'. :) –

-1

Dưới đoạn mã cập nhật giá trị của c, thêm mục mới 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())); 
Các vấn đề liên quan