用于映射的具有嵌套group by的收集器(java 8)

用于映射的具有嵌套group by的收集器(java 8),java,hashmap,java-stream,collectors,groupingby,Java,Hashmap,Java Stream,Collectors,Groupingby,我正在尝试处理具有以下格式的列表: List如果您可以将条目展平为三元组数据结构,则可以使用B键进行分组。虽然这对于映射条目是可行的,但在实现方面却相当混乱。更好的选择是创建自己的数据结构来临时保存这三个扁平属性 这里有一个类似的行,我将在解决方案中进一步使用 @Getter @AllArgsConstructor static class Holder { String a; String b; Item c; } 现在,另一个重要点是确保将结构展平,直到最里面的条目

我正在尝试处理具有以下格式的列表:
List如果您可以将条目展平为三元组数据结构,则可以使用
B
键进行分组。虽然这对于映射条目是可行的,但在实现方面却相当混乱。更好的选择是创建自己的数据结构来临时保存这三个扁平属性

这里有一个类似的行,我将在解决方案中进一步使用

@Getter
@AllArgsConstructor
static class Holder {
    String a;
    String b;
    Item c;
}
现在,另一个重要点是确保将结构展平,直到最里面的条目,而不仅仅是代码中共享的外部
映射。这需要使用嵌套的
flatMap

list.stream()
        .flatMap(out -> out.entrySet().stream()
                .flatMap(e -> e.getValue().entrySet().stream()
                        .map(in -> new Holder(e.getKey(), in.getKey(), in.getValue()))))
最后,您将得到一个
,它可以进一步分组两次并映射以推断预期结果。以下是实现这一目标的完整解决方案:

list.stream()
        .flatMap(out -> out.entrySet().stream()
                .flatMap(e -> e.getValue().entrySet().stream()
                        .map(in -> new Holder(e.getKey(), in.getKey(), in.getValue()))))
        .collect(Collectors.groupingBy(Holder::getA,
                Collectors.groupingBy(Holder::getB,
                        Collectors.mapping(Holder::getC,
                                Collectors.toList()))));

如果可以将条目展平为三元组数据结构,则可以使用
B
键进行分组。虽然这对于映射条目是可行的,但在实现方面却相当混乱。更好的选择是创建自己的数据结构来临时保存这三个扁平属性

这里有一个类似的行,我将在解决方案中进一步使用

@Getter
@AllArgsConstructor
static class Holder {
    String a;
    String b;
    Item c;
}
现在,另一个重要点是确保将结构展平,直到最里面的条目,而不仅仅是代码中共享的外部
映射。这需要使用嵌套的
flatMap

list.stream()
        .flatMap(out -> out.entrySet().stream()
                .flatMap(e -> e.getValue().entrySet().stream()
                        .map(in -> new Holder(e.getKey(), in.getKey(), in.getValue()))))
最后,您将得到一个
,它可以进一步分组两次并映射以推断预期结果。以下是实现这一目标的完整解决方案:

list.stream()
        .flatMap(out -> out.entrySet().stream()
                .flatMap(e -> e.getValue().entrySet().stream()
                        .map(in -> new Holder(e.getKey(), in.getKey(), in.getValue()))))
        .collect(Collectors.groupingBy(Holder::getA,
                Collectors.groupingBy(Holder::getB,
                        Collectors.mapping(Holder::getC,
                                Collectors.toList()))));
list.stream()
        .flatMap(out -> out.entrySet().stream()
                .flatMap(e -> e.getValue().entrySet().stream()
                        .map(in -> new Holder(e.getKey(), in.getKey(), in.getValue()))))
        .collect(Collectors.groupingBy(Holder::getA,
                Collectors.groupingBy(Holder::getB,
                        Collectors.mapping(Holder::getC,
                                Collectors.toList()))));