Premnath Kamalanathan Ответов: 0

Преобразование плоского объекта в иерархию с помощью java stream


Я пытаюсь использовать stream API для преобразования моего плоского списка объектов в иерархию. Я попытался найти похожие вопросы здесь, но не нашел ни одного, который работал бы более чем на одном уровне, так как в моем случае мне нужно, чтобы он работал на 2 уровня.

Мой плоский объект entity object выглядит следующим образом и я получаю список этих объектов из базы данных

public class AdmNodeRelation {
    private Integer id;
    private AdmEntityNode admEntityNode; // -> this has a Id and Node name property
    private AdmRelation onward; // -> this has a Id and relation Name property
    private AdmRelation outward;
}

Я пытаюсь преобразовать приведенный выше список объектов AdmNodeRelation в список AdmNode так, чтобы каждый узел имел свой список дальнейшего отношения, а который, в свою очередь, будет иметь соответствующий список внешнего отношения для узла:

public class AdmNode {
    private Integer nodeId;
    private String nodeName;
    private List<AdmInwardRelation> inwardRelation = new ArrayList<>();
}

public class AdmInwardRelation {
    private Integer relationId;
    private String relationName;
    private List<AdmOutwardRelation> outwardRelation = new ArrayList<>();
}

public class AdmOutwardRelation {
    private Integer relationId;
    private String relationName;
}


Что я уже пробовал:

Я смог получить желаемый результат с помощью forEach() и итерации по каждому плоскому объекту и создания структуры hirearchy, но чувствовал, что должен быть более простой способ через Stream API
<pre>Map<String, AdmNode> nodeMap = new HashMap();
    for (AdmNodeRelation nodeRelation : nodeRelations) {
        AdmEntityNode node = nodeRelation.getAdmEntityNode();

        //DTO AdmNde
        AdmNode modelNode = new AdmNode();
        if (!nodeMap.containsKey(node.getNodeName())) {

            BeanUtils.copyProperties(node, modelNode);
            nodeMap.put(node.getNodeName(), modelNode);
        } else {
            modelNode = nodeMap.get(node.getNodeName());
        }
        //DTO Inward Relation
        AdmInwardRelation inwardRelation = new AdmInwardRelation();
        BeanUtils.copyProperties(nodeRelation.getInwardRelation(), inwardRelation);

        //DTO Outward Relation
        AdmOutwardRelation outwardRelation = new AdmOutwardRelation();
        BeanUtils.copyProperties(nodeRelation.getOutwardRelation(), outwardRelation);

        Optional<AdmInwardRelation> existingInwardRelation = modelNode.getInwardRelation()
                .stream()
                .filter(i -> i.getRelationName().equals(inwardRelation.getRelationName()))
                .findAny();
        if (existingInwardRelation.isEmpty()) {
            inwardRelation.getOutwardRelation().add(outwardRelation);
            modelNode.getInwardRelation().add(inwardRelation);
        } else {
            existingInwardRelation.get().getOutwardRelation().add(outwardRelation);
        }
    }
    List<AdmNode>  nodeListToUI = new ArrayList<>(nodeMap.values());

Gerry Schmitz

Вопросы, на которых люди "застревают", как правило, привлекают внимание. Оптимизация чьих - то вещей не так уж и много.

0 Ответов