在 Java 8 中,如何将“平面”对象列表转换为嵌套对象列表?

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

我正在使用 Java 8。我有一个包含这些“MyFlatObject”对象的 java.util.List ...

public class MyFlatObject {
    private String category;
    private String productId;
    private String feature;
    ...
}

我如何将此列表转换为另一个类别对象列表,其中这些对象定义为

public class Category {
    private String category;
    private List<Product> products;
    ...
}

public class Product {
    private String productId;
    private List<String> features;
    ...
}

?目标是,如果 List 列表有 12 个对象,但只有 3 个不同的类别,则生成的 List 列表将只有三个对象,每个对象都有不同的 Category 对象,并且在每个 Category 对象中包含所有相关产品。

list java-8 nested java-stream collectors
1个回答
0
投票

您可能正在寻找的是

Collectors.groupingBy
以及使用
Collectors.mapping
的下游函数。如果我猜对了,您正在寻找按多个属性进行分组并将它们转换为新对象,这就是
Collectors.collectingAndThen
可能会很方便的地方。

假设这些类的 getter 和构造函数很少,该方法可能类似于:

List<Category> categories = flatObjects.stream()
        .collect(Collectors.collectingAndThen(
                Collectors.groupingBy(MyFlatObject::getCategory,
                        Collectors.collectingAndThen(
                                Collectors.groupingBy(MyFlatObject::getProductId,
                                        Collectors.mapping(MyFlatObject::getFeature, Collectors.toList())),
                                val -> val.entrySet()
                                        .stream()
                                        .map(e -> new Product(e.getKey(), e.getValue()))
                                        .toList())),
                val -> val.entrySet().stream()
                        .map(e -> new Category(e.getKey(), e.getValue()))
                        .toList())
        );
© www.soinside.com 2019 - 2024. All rights reserved.