Java 8 группа по String - PullRequest
0 голосов
/ 18 мая 2018

Вот мой код:

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

Это не дает правильный ответ.

1 Ответ

0 голосов
/ 18 мая 2018

Вам в основном нужен Stream, который сделан из Pair (я выбираю AbstractMap.SimpleEntry здесь), который имеет левую часть как хобби и правую, как ученик (может быть наоборот)значения).

Позже просто сгруппируйте те, которые основаны на Hobby (это строка в вашем случае).

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 как ссылка на метод, который получает ключ, выМожно также написать его как лямбда-выражение, если оно имеет больше смысла для вас:

Collectors.groupingBy(entry -> entry.getKey())
...