【问题标题】:Java8 : stream and map transformationsJava8:流和映射转换
【发布时间】:2018-10-04 08:57:44
【问题描述】:

我想把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&lt;String,List&lt;Person&gt;&gt;,我想要一个Map&lt;String,List&lt;String&gt;&gt;

有什么想法吗?

谢谢

【问题讨论】:

    标签: java collections java-8 java-stream


    【解决方案1】:

    使用Collectors.mappingPerson实例映射到对应的registrationIdStrings:

    Map<String, List<String>> map = 
        persons.stream()
               .collect(Collectors.groupingBy(Person::getPersonId,
                                              Collectors.mapping(Person::getRegistrationId,
                                                                 Collectors.toList())));
    

    【讨论】:

    • ‍ ‍‍‍‍Collectors.toMap() or Collectors.toList() ?
    • @HadiJ 哎呀,我打错了。谢谢!
    • 通过添加静态导入删除单词“Collectors”的实例将使此答案作为英文语句可读
    【解决方案2】:

    您也可以使用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;})); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多