如何使用Java 8 Collectors groupingBy 获取带有集合Map的Map?
How to use Java 8 Collectors groupingBy to get a Map with a Map of the collection?
想象一下这些类
class Subject {
private int id;
private Type type;
private String origin;
private String name;
Subject(int id, Type type, String origin, String name) {
this.id = id;
this.type = type;
this.origin = origin;
this.name = name;
}
// Getters and Setters
}
enum Type {
TYPE1,
TYPE2
}
我有这些主题的列表类
List<Subject> subjects = Arrays.asList(
new Subject(1, Type.TYPE1, "South", "Oscar"),
new Subject(2, Type.TYPE2, "South", "Robert"),
new Subject(3, Type.TYPE2, "North", "Dan"),
new Subject(4, Type.TYPE2, "South", "Gary"));
我想得到使用 Collectors.groupingBy()
地图的结果,首先按 Subject.origin
对 Subject
对象进行分组,然后按 Subject.type
[=18= 进行分组]
得到这样的对象Map<String, Map<Type, List<Subject>>>
groupingBy
接受下游收集器,也可以是 groupingBy
:
subjects.stream()
.collect(groupingBy(
Subject::getOrigin,
groupingBy(Subject::getType)
));
Stream<Subject> subjects = Stream.of(
new Subject(1, Subject.Type.TYPE1, "South", "Oscar"),
new Subject(2, Subject.Type.TYPE2, "South", "Robert"),
new Subject(3, Subject.Type.TYPE2, "North", "Dan"),
new Subject(4, Subject.Type.TYPE2, "South", "Gary"));
Map<String, Map<Subject.Type, List<Subject>>> subjectByOriginByType;
subjectByOriginByType = subjects.collect(Collectors.groupingBy(
s->s.getOrigin(), Collectors.groupingBy(
s->s.getType(),
Collectors.mapping((Subject s) -> s, Collectors.toList()))));
想象一下这些类
class Subject {
private int id;
private Type type;
private String origin;
private String name;
Subject(int id, Type type, String origin, String name) {
this.id = id;
this.type = type;
this.origin = origin;
this.name = name;
}
// Getters and Setters
}
enum Type {
TYPE1,
TYPE2
}
我有这些主题的列表类
List<Subject> subjects = Arrays.asList(
new Subject(1, Type.TYPE1, "South", "Oscar"),
new Subject(2, Type.TYPE2, "South", "Robert"),
new Subject(3, Type.TYPE2, "North", "Dan"),
new Subject(4, Type.TYPE2, "South", "Gary"));
我想得到使用 Collectors.groupingBy()
地图的结果,首先按 Subject.origin
对 Subject
对象进行分组,然后按 Subject.type
[=18= 进行分组]
得到这样的对象Map<String, Map<Type, List<Subject>>>
groupingBy
接受下游收集器,也可以是 groupingBy
:
subjects.stream()
.collect(groupingBy(
Subject::getOrigin,
groupingBy(Subject::getType)
));
Stream<Subject> subjects = Stream.of(
new Subject(1, Subject.Type.TYPE1, "South", "Oscar"),
new Subject(2, Subject.Type.TYPE2, "South", "Robert"),
new Subject(3, Subject.Type.TYPE2, "North", "Dan"),
new Subject(4, Subject.Type.TYPE2, "South", "Gary"));
Map<String, Map<Subject.Type, List<Subject>>> subjectByOriginByType;
subjectByOriginByType = subjects.collect(Collectors.groupingBy(
s->s.getOrigin(), Collectors.groupingBy(
s->s.getType(),
Collectors.mapping((Subject s) -> s, Collectors.toList()))));