问题描述
基本上Stream
,您需要一个由Pair
(我AbstractMap.SimpleEntry
在这里选择)的组件构成,该组件的左边部分为爱好,右边为学生(可以相反,这没关系)。
以后只需将其基于Hobby
(根据您的情况为String)进行分组。
data.stream()
.flatMap(student -> student.getHobbies().stream().map(hobby -> new SimpleEntry<>(hobby, student)))
.collect(Collectors.groupingBy(
Entry::getKey,
Collectors.mapping(Entry::getValue, Collectors.toList())
));
Entry::getKey
作为获取键的方法引用,如果对您更有意义,也可以将其编写为lambda表达式:
Collectors.groupingBy(entry -> entry.getKey())
解决方法
这是我的代码:
public class StudentData {
public static List<Student> getData() {
return Arrays.asList(
new Student(1,"a1",1,Arrays.asList("cricket","football","basketball")),new Student(2,"a2",Arrays.asList("chess","football")),new Student(3,"a3",2,Arrays.asList("running")),new Student(4,"a4",Arrays.asList("throwball",new Student(5,"a5",3,new Student(6,"a6",4,Arrays.asList("cricket")),new Student(7,"a7",5,Arrays.asList("basketball")),new Student(8,"a8",6,Arrays.asList("football")),new Student(9,"a9",8,Arrays.asList("tennis","swimming")),new Student(10,"a10",Arrays.asList("boxing","running")),new Student(11,"a11",9,new Student(12,"a12",11,"shuttle")),new Student(13,"a13",12,Arrays.asList("swimming"))
);
}
}
如何根据兴趣爱好对学生进行分组。我尝试下面的代码:
List<Student> data = StudentData.getData();
data.stream().collect(Collectors.groupingBy(s -> s.getHobbies().stream()));
它没有给出正确的答案。