Java 8按字符串分组

这是我的代码:

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())

以上是 Java 8按字符串分组 的全部内容, 来源链接: utcz.com/qa/412102.html

回到顶部