Сборщик для создания списка списков на основе свойства объекта - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующий объект:

Список лиц

И я хочу создать следующую структуру

Список> на основе фамилии.

Я могу сгруппировать их на карте с помощью groupingBy (p -> p.getFamilyName ()). Но я хотел бы иметь не карту, а список списков.

Вы можете сделать это в два этапа, используя метод values ​​() карты. Но я хотел бы знать, если вы можете сделать это с коллекционером.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы можете использовать collectingAndThen:

ArrayList<List<Person>> collect = stream.collect(
    Collectors.collectingAndThen(Collectors.groupingBy(Person::getFamilyName),
                                 m -> new ArrayList<>(m.values())));

Сначала применяется groupingBy, "а затем" создает ArrayList для каждого сгруппированного значения.

0 голосов
/ 26 апреля 2018

Вы можете собрать, используя groupingBy, а затем повторно направить entrySet в свой список.

    List<Map.Entry<String, List<Person>>> families = people.stream()
            .collect(Collectors.groupingBy(p -> p.familyName))
            .entrySet()
            .stream()
            .collect(Collectors.toList());
    System.out.println(families);

Если вам не нужна фамилия в качестве ключа, просто добавьте .map(e -> e.getValue()) передокончательный сбор:

    List<List<Person>> families = people.stream()
            .collect(Collectors.groupingBy(p -> p.familyName))
            .entrySet()
            .stream()
            .map(e -> e.getValue())
            .collect(Collectors.toList());

или просто потоковая передача values:

    List<List<Person>> families = people.stream()
            .collect(Collectors.groupingBy(p -> p.familyName))
            .values()
            .stream()
            .collect(Collectors.toList());
...