收集器groupingBy java 8

MCh*_*ker 4 java grouping java-8 collectors

考虑这两个类

主题类:

class Subject{
    long id;
    String category;
    String description;
    public Subject(long id,String category,String description){
        this.id=id;
        this.category=category;
        this.description=description;
    }
    // getters, setters, toString,...    
}
Run Code Online (Sandbox Code Playgroud)

观察者类:

class Observer{
    long id;
    Subject subject;
    public Observer(long id,Subject subject){
        this.id=id;
        this.subject=subject;
    }
    // getters, setters, toString,...
}
Run Code Online (Sandbox Code Playgroud)

并考虑这个观察员名单

Subject s1 = new Subject(1, "sport", "subject 1");
Subject s2 = new Subject(2, "music", "subject 2");
Subject s3 = new Subject(3, "sport", "subject 3");

List<Observer> observers = Arrays.asList(new Observer(1, s1),
        new Observer(2, s1), new Observer(3, s2), new Observer(4, s3));
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所尝试过并成功完成的是按照以下主题对观察者进行分组

Map<Subject, List<Observer>> observersGroupedBySubject = observers.stream().collect(
                Collectors.groupingBy(Observer::getSubject));
Run Code Online (Sandbox Code Playgroud)

但是,我怎么能组观察员主体的类别使用同上面的逻辑(Collectors,groupingBy,method reference,...)?

例如,我如何获得订阅主题的观察者,其类别等于sport使用类似的东西

Map<String, List<Observer>> observersGroupedBySubjectCategory = ...;
observersGroupedBySubjectCategory.get("sport");
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ale*_*you 5

使用

Collectors.groupingBy(o -> o.getSubject().getCategory())
Run Code Online (Sandbox Code Playgroud)

getSubjectCategory()Observer类中定义并使用方法参考:

Collectors.groupingBy(Observer::getSubjectCategory)
Run Code Online (Sandbox Code Playgroud)