[英]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
,...)? 但是,如何使用相同的上述逻辑(
Collectors
, groupingBy
, method 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.