Преобразование плоского объекта в иерархию с помощью 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
Вопросы, на которых люди "застревают", как правило, привлекают внимание. Оптимизация чьих - то вещей не так уж и много.