使用流将对象列表转换为地图

时间:2019-09-18 21:33:30

标签: java

我有一个A类的对象的列表:

List<A> list;
class A {
    String name;
    String lastname;
    //Getter and Setter methods
}

我想将此列表转换为从名称到一组姓氏的映射:

Map<String, Set<String>> map;

例如,对于以下列表:

John Archer,John Agate,Tom Keinanen,Tom Barren,Cindy King

地图应为:

John-> {Archer,Agate},Tom-> {Keinanen,Barren},Cindy-> {King}

我尝试了以下代码,但是它返回了从名称到A类对象的映射:

list.stream.collect(groupingBy(A::getFirstName, toSet()));

2 个答案:

答案 0 :(得分:4)

Map< String, Set<String>> map = list.stream()
                                    .collect(
                                        Collectors.groupingBy(
                                              A::getFirstName, Collectors.mapping(
                                                    A::getLastName, Collectors.toSet())));

您在正确的轨道上需要使用:

  • Collectors.groupingByfirstName分组。

  • ,然后使用Collectors.mappping之类的下游收集器作为Collectors.groupingBy的第二个参数来映射到lastName

  • 最后通过调用Set<String>将其收集在Collectors.toSet中:

答案 1 :(得分:2)

您从未告诉收集者提取姓氏。

我想你需要类似的东西

list.stream
  .collect(groupingBy(
    A::getFirstName, // The key is extracted.
    mapping(  // Map the stream of grouped values.
      A::getLastName, // Extract last names.
      toSet()  // Collect them into a set.
)));