2015-06-12 37 views
6

Tôi có một danh sách các pojos mà tôi muốn thực hiện một số nhóm. Một cái gì đó như:Nhóm Java 8 lambdas theo nhiều trường

public class Pojo { 
    private final Category category; 
    private final BigDecimal someValue; 
} 

public class Category { 
    private final String majorCategory; 
    private final String minorCategory; 
} 

Tôi muốn có một Map<String, Map<String, List<Pojo>>> nơi quan trọng là majorCategory và giá trị là một Map với phím minorCategory và giá trị là một List của Pojo các đối tượng cho biết minorCategory.

Tôi định sử dụng Java 8 lambda để đạt được điều này. Tôi có thể lấy cấp độ đầu tiên của nhóm thực hiện với những điều sau đây:

Map<String, Pojo> result = list 
    .stream() 
    .collect(groupingBy(p -> p.getCategory().getMajorCategory())); 

Làm thế nào tôi có thể bây giờ nhóm lại trên minorCategory và nhận được Map<String, Map<String, List<Pojo>>> tôi mong muốn?

Cập nhật

Câu trả lời đầu tiên cung cấp là chính xác cho các ví dụ được cung cấp ban đầu, tuy nhiên tôi đã từ cập nhật các câu hỏi. Lời bình luận của Ruben trong câu trả lời được chấp nhận, cung cấp phần cuối cùng của câu đố.

Trả lời

13
groupingBy(Pojo::getMajorCategory, groupingBy(Pojo::getMinorCategory)) 

nên hoạt động, tôi nghĩ vậy?

+1

Cảm ơn điều này, điều này không phù hợp với ví dụ trong câu hỏi của tôi nhưng tôi có thể đã quá đơn giản. Tôi đang thực sự nhóm trên một lĩnh vực trên một đối tượng chứa trong pojo của tôi, được đặt tên, nói, thể loại. Tôi đã thử '.collect (groupingBy (p -> p.getCategory(). GetMajorCategory(), groupingBy (p -> p.getCategory(). GetMinorCategory())))' nhưng nó không cắt mù tạt. Bạn có ý tưởng nào không? ' –

+5

@RobertBain list.stream(). Collect (groupingBy ((Pojo p) -> p.getCategory(). GetMajorCategory(), groupingBy ((Pojo p) -> p.getCategory(). getMinorCategory()))); – Ruben

+0

Sự khác nhau giữa tất cả các câu trả lời là gì ..? –

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