我想将List
变成不同的东西。
我有一个像这样的POJO类(我在这里删除了getters / setters):
public class Person {
private String personId;
private String registrationId;
}
Person
(personId)可以具有许多registrationId,因此不同的Person
实例可以引用相同的真实人(但是具有不同的registrationId)。
我有一个List<Person> persons
,其中包含3个元素:
persons = [{"person1", "regis1"}, {"person1", "regis2"}, {"person2", "regis1"}];
我想要这样的东西(这样每个键都指向一个人,并且我为每个人获得了registrationId的列表):
Map<String, List<String>> personsMap = [ "person1" : {"regis1", "regis2"}, "person2" : {"regis2"}]
我知道我可以做这样的事情:
Map<String, List<Person>> map = persons.stream().collect(Collectors.groupingBy(Person::getPersonId));
但是我有一个Map<String,List<Person>>
,我想要一个Map<String,List<String>>
有什么想法吗?
谢谢
答案 0 :(得分:7)
使用Collectors.mapping
将Person
实例映射到相应的registrationId String
:
Map<String, List<String>> map =
persons.stream()
.collect(Collectors.groupingBy(Person::getPersonId,
Collectors.mapping(Person::getRegistrationId,
Collectors.toList())));
答案 1 :(得分:0)
您还可以将toMap
与合并功能
Map<String,List<String>> map= persons
.stream()
.collect(Collectors.toMap(Person::getPersonId,
value->new ArrayList<>(Arrays.asList(Person::getRegistrationId)),
(l1,l2)->{l1.addAll(l2);return l1;}));
@Holger评论说不需要创建一个临时数组。
Map<String,List<String>> map= persons
.stream()
.collect(Collectors.toMap(Person::getPersonId,
value->new ArrayList<>(Collections.singletonList(Person::getRegistrationId)),
(l1,l2)->{l1.addAll(l2);return l1;}));