Java 将Long列表转换为以Long item为键、以String列表为值的映射

Java 将Long列表转换为以Long item为键、以String列表为值的映射,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个人 class Person{ private Long id; private String firstName; private String lastName; //with getters and setters } 我有一个下面的方法,它接收一个人的id并返回一个与这个人相关联的标签列表 public List<String> getTags(Long personId){ /*ExampleImplementation*/ someCol

我有一个人

class Person{
  private Long id;
  private String firstName;
  private String lastName;
  //with getters and setters
}
我有一个下面的方法,它接收一个人的id并返回一个与这个人相关联的标签列表

public List<String> getTags(Long personId){
 /*ExampleImplementation*/
   someCollection.stream()
     .filter(Objects::nonNull)
     .map(SomeType::someMethod)
     .filter(Objects:nonNull)
     .collect(Collectors.toList());
}
公共列表getTags(长personId){
/*示例实现*/
someCollection.stream()
.filter(对象::非空)
.map(SomeType::someMethod)
.filter(对象:非空)
.collect(Collectors.toList());
}
我正在构建一个方法,以便获得所有personId的映射以及与personId相关联的标记列表

public Map<Long, List<String>>getPersonTags(List<Long> personIds){
  return personIds.stream()
            .collect(Collectors.groupingBy(
            (personId) -> personId,
            Collectors.mapping(this::getTags, Collectors.toList())));
}
公共地图GetPersonTags(列出人名){
return personIds.stream()
.collect(收集器.groupingBy(
(personId)->personId,
Collectors.mapping(this::getTags,Collectors.toList());
}

但是
getPersonTags()
正在返回一个
Map
,但是我希望返回一个
Map
,我应该更改什么来获得预期的返回类型。

如果
personIds
包含不同的值,则不需要使用
groupingBy()
。改用
toMap()

return personIds.stream()
        .collect(Collectors.toMap(Function.identity(), this::getTags));

为什么
getTags()
不使用
personId
?您的
personId是否不同?如果是这样,只需使用
Collectors.toMap()
@shmosel编辑我的评论:在集合中没有人不是唯一的。这就是我尝试使用Collection.groupingBy的原因,因为出现了“重复密钥”错误。我编辑了我对您的问题的评论:在我拥有的集合中,没有人不是唯一的。这就是我必须尝试Collection.groupingBy的原因,因为出现了“重复密钥”错误。很抱歉之前的信息有误