比方说,我有一个对象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>>()
作为初始值然后通过将元素放入其中来聚合到它?
personList.stream()
.collect(Collectors.groupingBy(
Person::getFirstName,
Collectors.mapping(Person::getLastName, Collectors.toList())));
您正在寻找groupingBy
的下游收藏家
这应该适合你:
Map<String, List<String>> map = personList.stream()
.collect(Collectors.groupingBy(Person::getFirstName,
Collectors.mapping(Person::getLastName, Collectors.toList())));
我想你正在寻找这样的东西:
Map<String, Map<String, List>> map = personList.stream()
.collect(groupingBy(Person::getFirstName, groupingBy(Person::getLastName)));
双重分组为您提供地图的地图。这就是诀窍。