问题描述
这是我的代码:
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"))
);
}
}
如何根据兴趣爱好对学生进行分组.我在下面的代码中尝试过此代码:
How to group the student based on hobbies. I tried this below code:
List<Student> data = StudentData.getData();
data.stream().collect(Collectors.groupingBy(s -> s.getHobbies().stream()));
它没有给出正确的答案.
It is not giving the right answer.
推荐答案
您基本上需要一个Stream
,该Stream
由Pair
(我在这里选择AbstractMap.SimpleEntry
)组成,其左侧为爱好,并且就像学生一样(反之亦然,没关系).
You basically need a Stream
that is made out of a Pair
(I choose AbstractMap.SimpleEntry
here) that has the left part as a Hobby and right as the Student (could be the other way around, does not matter).
以后只将基于Hobby
的内容(在您的情况下为String)分组.
Later just group those based on Hobby
(that is a String in your case).
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表达式:
Entry::getKey
being a method reference that gets the key, you could write it as a lambda expression too, if it makes more sense for you:
Collectors.groupingBy(entry -> entry.getKey())
这篇关于Java 8按字符串分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!