Java:分组按子值作为值

2022-09-01 22:55:07

比方说,我有一个对象 Person,其字段类型为“名字”和“姓氏”。现在我也有一个,我喜欢使用流。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>>()


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

您正在寻找一个下游收集器groupingBy


答案 2

这应该适用于您:

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

推荐