简体   繁体   English

收集器groupingBy java 8

[英]Collectors groupingBy java 8

Consider these two classes 考虑这两个类

Subject class: 主题类:

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,...    
}

Observer class: 观察者类:

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

And consider this list of observers 并考虑这个观察员名单

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));

What i have tried so far and succeeded to do it is to group observers by subject as follow 到目前为止,我所尝试过并成功完成的是按照以下主题对观察者进行分组

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

But how can i group observers by subject's category using the same above logic ( Collectors , groupingBy , method reference ,...)? 但是,如何使用相同的上述逻辑( CollectorsgroupingBymethod reference ,......)按主题类别对观察者进行groupingBy

For instance, how can i get observers that subscribed to a subject whose category equals to sport using something like this 例如,我如何通过使用类似的东西来获得订阅类别等于sport的主题的观察者

Map<String, List<Observer>> observersGroupedBySubjectCategory = ...;
observersGroupedBySubjectCategory.get("sport");

Thanks. 谢谢。

Use 采用

Collectors.groupingBy(o -> o.getSubject().getCategory())

or define getSubjectCategory() in Observer class and use method reference: 或者在Observer类中定义getSubjectCategory()并使用方法引用:

Collectors.groupingBy(Observer::getSubjectCategory)

But how can i group observers by subject's category using the same above logic (Collectors, groupingBy, method reference,...)? 但是,如何使用相同的上述逻辑(收集器,分组,方法参考,......)按主题类别对观察者进行分组?

As I explained here (the second part), you just need to provide a function that will take the subject's category for a given observer. 正如我在这里解释的那样(第二部分),你只需要提供一个函数来获取给定观察者的主题类别。 So in this case it will be: 所以在这种情况下它将是:

groupingBy(o -> o.getSubject().getCategory())

This will give you a Map<String, List<Observer>> . 这将为您提供Map<String, List<Observer>>

Use a filter. 使用过滤器。

Map<Subject, List<Observer>> observersGroupedBySubject = observers
                .stream()
                .filter((u) -> u.getSubject().getCategory()
                        .equalsIgnoreCase("sport"))
                .collect(Collectors.groupingBy(Observer::getSubject));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM