Java8:流和地图转换

时间:2018-10-04 08:57:45

标签: java collections java-8 java-stream

我想将List变成不同的东西。

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

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

Person(personId)可以具有许多registrationId,因此不同的Person实例可以引用相同的真实人(但是具有不同的registrationId)。

我有一个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 :(得分:7)

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

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

答案 1 :(得分:0)

您还可以将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;}));