对嵌套结构中的平面对象列表进行分组
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;
}
注意重要的是B
和C
的equals
和hashCode
分别只依赖于a1
和a3
.
然后给定 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>>>
。
我有一个对象 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;
}
注意重要的是B
和C
的equals
和hashCode
分别只依赖于a1
和a3
.
然后给定 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>>>
。