Java8:流和地图转换

Ant*_*arf 3 java collections java-8 java-stream

我想把变成一个List不同的东西.

我有一个像这样的POJO类(我在这里删除了getters/setters):

public class Person {
   private String personId;
   private String registrationId;
}
Run Code Online (Sandbox Code Playgroud)

A Person(personId)可以有很多registrationId,因此不同的Person实例可以引用同一个真实的人(但具有不同的registrationId).

我有List<Person> persons以下3个元素:

persons = [{"person1", "regis1"}, {"person1", "regis2"}, {"person2", "regis1"}];
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西(这样每个键都指的是一个人,每个人都得到了registrationId列表):

Map<String, List<String>> personsMap = [ "person1" : {"regis1", "regis2"}, "person2" : {"regis2"}]
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

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

但我得到了一个Map<String,List<Person>>,我想要一个Map<String,List<String>>

有任何想法吗 ?

谢谢

Era*_*ran 7

用于Collectors.mappingPerson实例映射到相应的registrationId String:

Map<String, List<String>> map = 
    persons.stream()
           .collect(Collectors.groupingBy(Person::getPersonId,
                                          Collectors.mapping(Person::getRegistrationId,
                                                             Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

  • `Collectors.toMap()`或`Collectors.toList()`? (2认同)