2016-02-27 54 views
5

Tôi gặp một số khó khăn khi tìm cách tiếp cận/triển khai tốt bằng API luồng sau:Java 8 Phát trực tuyến: Nhóm với tổng hợp

Tôi có danh sách các phần tử, mỗi phần tử bao gồm một chuỗi và một số nguyên. Bây giờ tôi muốn nhóm các phần tử theo các giá trị chuỗi của chúng, và sau đó cho mỗi nhóm tôi muốn có tổng các giá trị số nguyên từ các phần tử có liên quan đến nhóm đó.

Ví dụ: Tôi có 3 yếu tố sau:

("GroupA", 100) ("GroupA", 50) ("GroupB", 10) 

Và như một kết quả tôi muốn để có được một bản đồ bao gồm các nội dung sau hai (key, value) cặp:

("GroupA, 150) ("GroupB, 10) 

tôi 'không chắc chắn làm thế nào để giải quyết điều này. Điều hứa hẹn nhất mà tôi đã đưa ra cho đến thời điểm này là:

elements.stream().collect(Collectors.groupingBy(e-> e.getGroup())) 
      .merge(group, elementsOfTheGroup, (...)); 

Nhưng tôi không chắc chắn nên chèn hàm nào làm thông số cuối cùng của phương thức hợp nhất. Nhưng tôi không biết liệu tôi có nên sử dụng phương thức hợp nhất hay không.

Triển khai thanh lịch nhất cho việc này là gì?

Trả lời

8

Bạn cần thêm bộ thu hạ lưu vào Collectors.groupingBy(classifier, downstream). Người thu gom này thu thập tất cả các phần tử được phân loại cho cùng một khóa. Trong trường hợp này, chúng ta chỉ cần tổng hợp tất cả các số với nhau bằng cách sử dụng Collectors.summingInt(mapper), với trình ánh xạ là một hàm trả về số để tổng hợp.

Giả sử con số này có thể được lấy ra với getter getNumber(), bạn có thể có:

Map<String, Integer> result = 
    elements.stream().collect(Collectors.groupingBy(
     e -> e.getGroup(), 
     Collectors.summingInt(e -> e.getNumber()) 
    )); 

Bạn có thể sử dụng một phương pháp tham chiếu thay vì hai lambdas trên. Ví dụ: nếu lớp của các phần tử là Element, bạn sẽ có

Map<String, Integer> result = 
    elements.stream().collect(Collectors.groupingBy(
     Element::getGroup, 
     Collectors.summingInt(Element::getNumber) 
    )); 
+0

tuyệt vời, cảm ơn bạn! – user3237736

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