2016-07-13 23 views
7

Làm thế nào, với các luồng Java/8/lambdas, tôi có thể tìm thấy mức trung bình của Danh sách các bản đồ theo các khóa không?Java 8 lambdas để tìm mức trung bình của danh sách bản đồ

Ví dụ:

List<Map<String, Double>> users = Arrays.asList(
    new HashMap<String, Double>() 
    {{ 
     put("weight", 109.0); 
     put("height", 180.2);   
    }}, 
    new HashMap<String, Double>() 
    {{ 
     put("weight", 59.0); 
     put("height", 186.2);   
    }} 
); 

Map<String, Double> statistics = 
//<MISSED CODE with lambdas> (?) 

System.out.println(statistics); 
//{weight=84.0, height=183.1) 

Với foreachs tốt cũ nó khá đơn giản, tôi tự hỏi nếu điều đó có thể đạt được với lambdas. Lý do tôi cần nó là tôi sẽ sử dụng Apache Spark và Java-8 lambdas sẽ là một cách tiếp cận tiêu chuẩn hơn cho nó.

+1

được bạn tạo ra một bản đồ chỉ để giữ cho 2 giá trị? – Andrew

+0

tốt, trên thực tế nó không phải là một bản đồ mà là Tuple4 của scala lib. tại thời điểm này có 4 giá trị, do đó, nó không phải là trường hợp do những thay đổi sắp xảy ra – Bogdan

+0

@Bogdan Tại sao bạn yêu cầu một giải pháp Java khi bạn đang sử dụng Scala? – Flown

Trả lời

6

Andrew Tobilko cho biết, bạn nên sử dụng cấu trúc dữ liệu thích hợp không phải Map s.

Nếu bạn nhấn mạnh vào việc sử dụng List<Map<>> thì bạn cần phải Stream::flatMap số Map::entrySet và sử dụng số Collector s thích hợp.


List<Map<String, Double>> users = Arrays.asList(new HashMap<String, Double>() { 
    { 
    put("weight", 109.0); 
    put("height", 180.2); 
    } 
}, new HashMap<String, Double>() { 
    { 
    put("weight", 59.0); 
    put("height", 186.2); 
    } 
}); 

Map<String, Double> statistics = users.stream().flatMap(m -> m.entrySet().stream()) 
    .collect(
     Collectors.groupingBy(Entry::getKey, Collectors.averagingDouble(Entry::getValue)) 
    ); 

System.out.println(statistics); 
// {weight=84.0, height=183.2} 
Các vấn đề liên quan