2014-09-16 29 views
8

Tôi mới dùng java và lambda, tôi muốn tìm tổng và giá trị trung bình của các giá trị trong bản đồ bản đồ.Lặp lại mặc dù Bản đồ Bản đồ với Lambda trong Java 8?

đối tượng của tôi là như Map<String, Map<String, Double>> browserData;

dữ liệu là các định dạng

<Chrome, <UK, 2.90>> 
<Chrome, <US, 5.20>> 
<Chrome, <EU, -0.25>> 
<IE, <UK, 0.1>> 
<IE, <US, -.20>> 
<IE, <EU, 0.00>> 
<FF, <UK, 0.90>> 
<FF, <US, 1.20>> 
<FF, <EU, 1.25>> 

Kết quả cuối cùng cần phải được hai bản đồ, 1 để tổng hợp và một cho trung bình

map1 = <CountryName, SumValue> 

map2 = <CountryName, AverageValue> 

Vì vậy, các kết quả của ví dụ trên, nó sẽ là

map1 = <UK, 3.9> 
     <US, 6.2> 
     <EU, 1> 

map2 = <UK, 1.3> 
     <US, 2.07> 
     <EU, 0.33> 

Làm cách nào để đạt được điều này?

+2

Bạn nên cung cấp mã bạn đã cố gắng. Nếu không, câu hỏi này trông giống như một câu hỏi * "Hãy cho tôi câu hỏi codez" *. – jww

Trả lời

7

Ý tưởng là để dòng mỗi mục của các bản đồ bên trong và áp dụng các nhà sưu tập thích hợp để tính toán các giá trị bạn cần:

Map<String, DoubleSummaryStatistics> stats = browserData.values().stream() 
     .flatMap(m -> m.entrySet().stream()) //Stream the inner maps' entrySets 
     .collect(groupingBy(Entry::getKey, summarizingDouble(Entry::getValue))); 
DoubleSummaryStatistics ds = stats.getOrDefault("EU", new DoubleSummaryStatistics()); 
System.out.println("sumEu = " + ds.getSum()); 
System.out.println("avgEu = " + ds.getAverage()); 

Nếu bạn cần số tiền cá nhân và bản đồ trung bình, bạn có thể tạo chúng ra khỏi bản đồ tóm tắt:

Map<String, Double> map1 = stats.entrySet().stream() 
     .collect(toMap(Entry::getKey, e -> e.getValue().getSum())); 
Map<String, Double> map2 = stats.entrySet().stream() 
     .collect(toMap(Entry::getKey, e -> e.getValue().getAverage())); 

lưu ý: tôi đã sử dụng nhập khẩu tĩnh sau:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summarizingDouble;
import static java.util.stream.Collectors.toMap;

+0

Cảm ơn bạn, các tác phẩm của nó như sự quyến rũ. Đã đến lúc hiểu rồi. – victor

Các vấn đề liên quan