使用List.stream将对象列表分组为另 一种类型的对象列表

问题描述 投票:0回答:1

我有以下两个课程:

public class Child {
    private String name;
    private int roll;
    private int age;
    private Date dob;

   . . . .
   getters and setters
   . . . . 
  }

public class Parent {
    private String name;
    private int age;

    private List<Child> children;
   . . . .
   getters and setters
   . . . . 
  }

现在我有一个List<Child>作为输入。我想根据名称和年龄属性对列表进行分组,并使用List<Parent>生成List.stream()。任何指针将不胜感激,并在此先感谢。

编辑:

ParentChild类之间的映射将是Parent.name等于Child.name,而Parent.age等于Child.age(用于分组的属性);

java stream java-stream
1个回答
0
投票

您可以通过两个Map<String, Map<Integer, List<Child>>>收集器获得一个groupingBy

Map<String, Map<Integer, List<Parent>>> grouped = 
    input.stream()
         .collect(Collectors.groupingBy(Child::getName,
                                        Collectors.groupingBy(Child::getAge)));

Map可用于生成Parent实例:

List<Parent> parents = 
    grouped.entrySet()
           .stream()
           .flatMap(e1 -> e1.getValue()
                            .entrySet()
                            .stream()
                            .map(e2 -> new Parent(e1.getKey(),e2.getKey(),e2.getValue())))
           .collect(Collectors.toList());

假设存在Parent构造函数,该构造函数接受名称,年龄和List<Child>

© www.soinside.com 2019 - 2024. All rights reserved.