Java: подгруппа groupingBy как значение - PullRequest
0 голосов
/ 18 октября 2018

Допустим, у меня есть объект Person с полями типа FirstName и LastName.Теперь у меня также есть List<Person>, и я люблю использовать потоки.

Теперь я хочу сгенерировать Map<FirstName, List<LastName>>, чтобы группировать людей с одинаковыми именами.Как мне это сделать без написания большого количества кода?Пока что мой подход

personList
.stream()
.collect(Collectors.groupingBy(
    Person::getFirstName,
    person -> person.getLastName() // this seems to be wrong
));

, но кажется, что это неправильный способ присвоить значение карте.Что я должен изменить?Или, возможно, мне следует использовать .reduce с new HashMap<FirstName, List<LastName>>() в качестве начального значения, а затем объединить его, поместив элементы внутрь?

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Это должно работать для вас:

Map<String, List<String>> map = personList.stream()
                .collect(Collectors.groupingBy(Person::getFirstName, 
                        Collectors.mapping(Person::getLastName, Collectors.toList())));
0 голосов
/ 18 октября 2018
personList.stream()
          .collect(Collectors.groupingBy(
               Person::getFirstName,
               Collectors.mapping(Person::getLastName, Collectors.toList())));

Вы ищете нижний коллектор с groupingBy

0 голосов
/ 18 октября 2018

Я думаю, вы ищете что-то вроде этого:

Map<String, Map<String, List>> map = personList.stream()
  .collect(groupingBy(Person::getFirstName, groupingBy(Person::getLastName)));

Двойная группировка дает вам карту карты.Это хитрость.

...