Преобразование списка объектов в карту с использованием потоков - PullRequest
1 голос
/ 19 сентября 2019

У меня есть список объектов класса A:

List<A> list;
class A {
    String name;
    String lastname;
    //Getter and Setter methods
}

Я хочу преобразовать этот список в карту из имени в набор фамилий:

Map<String, Set<String>> map;

Например,, для следующего списка:

Джон Арчер, Джон Агат, Том Кейнанен, Том Баррен, Синди Кинг

Карта будет:

Джон -> {Арчер, Агат}, Tom -> {Keinanen, Barren}, Cindy -> {King}

Я попробовал следующий код, но он возвращает карту от имени к объектам класса A:

list.stream.collect(groupingBy(A::getFirstName, toSet()));

Ответы [ 2 ]

4 голосов
/ 19 сентября 2019
Map< String, Set<String>> map = list.stream()
                                    .collect(
                                        Collectors.groupingBy(
                                              A::getFirstName, Collectors.mapping(
                                                    A::getLastName, Collectors.toSet())));

Вы были на правильном пути, который нужно использовать:

  • Collectors.groupingBy для группировки по firstName.

  • А затем используйте нисходящий коллектор, такой как Collectors.mappping, в качестве второго параметра Collectors.groupingBy для сопоставления с lastName.

  • И затем, наконец, соберите его в Set<String>вызывая Collectors.toSet:

2 голосов
/ 19 сентября 2019

Вы никогда не говорили сборщику извлекать фамилии.

Полагаю, вам нужно что-то вроде

list.stream
  .collect(groupingBy(
    A::getFirstName, // The key is extracted.
    mapping(  // Map the stream of grouped values.
      A::getLastName, // Extract last names.
      toSet()  // Collect them into a set.
)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...