这是我的代码:
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", 1, Arrays.asList("chess", "football")),
new Student(3, "a3", 2, Arrays.asList("running")),
new Student(4, "a4", 2, Arrays.asList("throwball", "football")),
new Student(5, "a5", 3, Arrays.asList("cricket", "basketball")),
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", 8, Arrays.asList("boxing", "running")),
new Student(11, "a11", 9, Arrays.asList("cricket", "football")),
new Student(12, "a12", 11, Arrays.asList("tennis", "shuttle")),
new Student(13, "a13", 12, Arrays.asList("swimming"))
);
}
}
如何根据兴趣爱好对学生进行分组。我尝试下面的代码:
List<Student> data = StudentData.getData();
data.stream().collect(Collectors.groupingBy(s -> s.getHobbies().stream()));
它没有给出正确的答案。
基本上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())
谢谢@Eugene ..只是我重新编写了代码。Map <String,List <Student >> collect5 = data.stream().flatMap(x-> x.getHobbies()。stream()。map(y-> new SimpleEntry <>(y,x))).collect (Collectors.groupingBy(Entry :: getKey,Collectors.mapping(Entry :: getValue,Collectors.toList())));;