Java:将子值作为值分组

时间:2018-10-18 17:21:24

标签: java java-stream collectors

比方说,我有一个对象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 :(得分:9)

personList.stream()
          .collect(Collectors.groupingBy(
               Person::getFirstName,
               Collectors.mapping(Person::getLastName, Collectors.toList())));

您正在使用groupingBy

寻找下游收集器

答案 1 :(得分:5)

这应该对您有用:

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

答案 2 :(得分:0)

我认为您正在寻找这样的东西:

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

双重分组为您提供了地图。这就是窍门。