收集器groupingBy java 8

时间:2015-05-06 19:41:15

标签: java java-8 grouping 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,...    
}

观察员类:

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

但是,我如何使用相同的上述逻辑(CollectorsgroupingBymethod reference,...)按主题类别对观察者进行分组?

例如,我如何使用类似这样的东西来订阅订阅类别等于sport的主题的观察者

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

感谢。

3 个答案:

答案 0 :(得分:5)

使用

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

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

Collectors.groupingBy(Observer::getSubjectCategory)

答案 1 :(得分:4)

  

但是我如何使用相同的主题类别对观察者进行分组   高于逻辑(收集器,分组,方法参考,......)?

正如我解释here(第二部分),你只需要提供一个函数来获取给定观察者的主题类别。所以在这种情况下它将是:

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

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

答案 2 :(得分:0)

使用过滤器。

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