Java 8中的Collectors.groupingBy

4

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

观察者类:

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

考虑一下这些观察者的列表。
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));

我尝试并成功地做到的是按以下方式将观察者按主题分组。
Map<Subject, List<Observer>> observersGroupedBySubject = observers.stream().collect(
                Collectors.groupingBy(Observer::getSubject));

但是,如何使用上述逻辑(Collectors、groupingBy、方法引用等)按主题类别对观察者进行分组呢?例如,如何使用类似以下内容的方式获取订阅了类别为“sport”的主题的观察者?
Map<String, List<Observer>> observersGroupedBySubjectCategory = ...;
observersGroupedBySubjectCategory.get("sport");

感谢您。

1
例如,我如何将订阅了类别为“体育”的主题的观察者分组?您想要什么结果?(给出一个示例输出。)听起来您不需要使用groupingBy,而是需要使用过滤器。 - Radiodef
2
按组分类(o -> o.getSubject().getCategory())。 或在Observer类中定义getSubjectCategory()方法。 - Alex Salauyou
1
@SashaSalauyou 如果你认为那是他们想要的,把它作为答案发布。(不要使用评论来回答。) - Radiodef
@Radiodef 我不想要一个过滤器,而是一个分组。请查看已编辑的答案。 - MChaker
1
@Radiodef 这只是一个建议。承诺将来适当地使用注释。 - Alex Salauyou
3个回答

6

使用

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

或者在Observer类中定义getSubjectCategory()并使用方法引用:

Collectors.groupingBy(Observer::getSubjectCategory)

4
但是我如何使用相同的逻辑(Collectors、groupingBy、方法引用等)按主题类别对观察者进行分组呢?
正如我这里(第二部分)所解释的那样,您只需要提供一个函数,该函数将为给定观察者获取主题类别。因此,在这种情况下,它将是:
groupingBy(o -> o.getSubject().getCategory())

这将给你一个Map<String,List<Observer>>


0
使用过滤器。
Map<Subject, List<Observer>> observersGroupedBySubject = observers
                .stream()
                .filter((u) -> u.getSubject().getCategory()
                        .equalsIgnoreCase("sport"))
                .collect(Collectors.groupingBy(Observer::getSubject));

1
谢谢回答。但我不想要一个过滤器,而是想要按主题类别直接进行分组。 - MChaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接