对嵌套结构中的平面对象列表进行分组

Grouping a list of flat objects in a nested structure

我有一个对象 A 列表,其中对象 A 具有以下形式:

Class A {
private String a1;
private String a2;
private String a3;
private String a4;
private String a5;
private String a6;
}

我需要先将此列表按 a1 分组,然后再按 a3 分组,结果如下: Map<B, Map<C, List<D>>>,其中对象 B 具有这种形式

Class B {
private String a1; 
private String a2;
}

并且对象 C 具有这种形式

Class C {
private String a3;
private String a4;
}

并且对象 D 具有这种形式

Class D {
private String a5;
private String a6;
}

Java11 中的流是否可能?欢迎任何其他实现此目标的方法,非常感谢!

假设你的 类 上有这些 lombok 注释(如果你没有 lombok 也没关系 - 如果你还没有这些样板,你可以将它们添加到你的 类 ):

@Getter
class A {
    private String a1;
    private String a2;
    private String a3;
    private String a4;
    private String a5;
    private String a6;
}

@AllArgsConstructor
@EqualsAndHashCode(exclude = "a2")
class B {
    private String a1;
    private String a2;
}

@AllArgsConstructor
@EqualsAndHashCode(exclude = "a4")
class C {
    private String a3;
    private String a4;
}

@AllArgsConstructor
class D {
    private String a5;
    private String a6;
}

注意重要的是BCequalshashCode分别只依赖于a1a3 .

然后给定 List<A> aList,你可以像这样嵌套 groupingBy 个收集器,最后,将每个东西映射到 D.

var map = aList.stream().collect(
    Collectors.groupingBy(
        x -> new B(x.getA1(), x.getA2()),
        Collectors.groupingBy(
            x -> new C(x.getA3(), x.getA4()),
            Collectors.mapping(
                x -> new D(x.getA5(), x.getA6()),
                Collectors.toList()
            )
        )
    )
);

map将是Map<B, Map<C, List<D>>>