Java8: преобразования потоков и карт - PullRequest
0 голосов
/ 04 октября 2018

Я хочу превратить List во что-то другое.

У меня есть такой класс POJO (я убрал здесь геттеры / сеттеры):

public class Person {
   private String personId;
   private String registrationId;
}

A Person(personId) может иметь много регистрационных идентификаторов, поэтому разные экземпляры Person могут ссылаться на одного и того же реального человека (но имеют разные регистрационные идентификаторы).

У меня есть List<Person> persons, как показано ниже, с 3 элементами:

persons = [{"person1", "regis1"}, {"person1", "regis2"}, {"person2", "regis1"}];

Я бы хотел что-то вроде этого (чтобы каждый ключ ссылался на человека, и для каждого человека я получил список registrationId):

Map<String, List<String>> personsMap = [ "person1" : {"regis1", "regis2"}, "person2" : {"regis2"}]

Я знаю, что могу сделать что-то вроде этого:

Map<String, List<Person>> map = persons.stream().collect(Collectors.groupingBy(Person::getPersonId));

Но я получил Map<String,List<Person>>, и я хотел бы Map<String,List<String>>

Есть идеи?

Спасибо

Ответы [ 2 ]

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

А также вы можете использовать toMap с функцией слияния

Map<String,List<String>> map= persons
      .stream()
      .collect(Collectors.toMap(Person::getPersonId,
                        value->new ArrayList<>(Arrays.asList(Person::getRegistrationId)),
                        (l1,l2)->{l1.addAll(l2);return l1;}));

, поскольку @Holger отметил, что не нужно создавать временный массив.

Map<String,List<String>> map= persons
  .stream()
  .collect(Collectors.toMap(Person::getPersonId,
                    value->new ArrayList<>(Collections.singletonList(Person::getRegistrationId)),
                    (l1,l2)->{l1.addAll(l2);return l1;})); 
0 голосов
/ 04 октября 2018

Используйте Collectors.mapping для сопоставления экземпляров Person с соответствующим регистрационным идентификатором String s:

Map<String, List<String>> map = 
    persons.stream()
           .collect(Collectors.groupingBy(Person::getPersonId,
                                          Collectors.mapping(Person::getRegistrationId,
                                                             Collectors.toList())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...