Java:groupingBy subvalue as value

问题描述 投票:8回答:3

比方说,我有一个对象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>>()作为初始值然后通过将元素放入其中来聚合到它?

java java-stream collectors
3个回答
10
投票
personList.stream()
          .collect(Collectors.groupingBy(
               Person::getFirstName,
               Collectors.mapping(Person::getLastName, Collectors.toList())));

您正在寻找groupingBy的下游收藏家


5
投票

这应该适合你:

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

0
投票

我想你正在寻找这样的东西:

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

双重分组为您提供地图的地图。这就是诀窍。

© www.soinside.com 2019 - 2024. All rights reserved.