首页 > 解决方案 > Java 8 Stream 将列表转换为映射,其中映射键是从列表的两个字段派生的对象?

问题描述

class Person{
    private String first;
    private String last;
    private BigDecimal gpa;
    private int age;
}

class PersonKey{
    private String first;
    private String last;
}

现在我已经List<Person>并且想要将其转换为Map<PersonKey, Person>where PersonKeyis just the unique key value of a person。如何使用 Java 流实现这一点?

标签: javajava-8java-stream

解决方案


我相信这就是您正在寻找的(假设没有两个人有相同的名字)。密钥是使用来自 Person 的 getter 和来自 PersonKey 的构造函数即时构造的。

Map<PersonKey, Person> map = list.stream()
       .collect(Collectors.toMap(
                 person->new PersonKey(person.getFirst(),person.getLast()), 
                 person->person));

为了容纳同名的人,你可以把他们放在一个Map<PersonKey,List<Person>>

Map<PersonKey, List<Person>> map = list.stream()
              .collect(Collectors.groupingBy(person->new 
                              PersonKey(person.getFirst(),
                                        person.getLast())));

推荐阅读