温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Java 8 group by String
grouping java java-8 java-stream

其他 - Java 8按字符串分组

发布于 2020-04-11 23:18:09

这是我的代码:

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

它没有给出正确的答案。

查看更多

提问者
Learn Hadoop
被浏览
37
Eugene 2018-05-18 20:39

基本上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())