比方说,我有一个对象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>>()
用作初始值,然后通过将元素放入其中来将其聚合?
答案 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)));
双重分组为您提供了地图。这就是窍门。