저는 Java 8 Streams API에 상당히 익숙하지만 새로운 기능을 위해 사용하기로 결정했지만 벽돌 벽에 부딪혔습니다!스트림 트리 변환
MenuItem parent1 = new MenuItem(0L, "Code Parent", "Description Parent");
MenuItem item1 = new MenuItem(1L, "Code1", "Description1");
MenuItem item2 = new MenuItem(2L, "Code2", "Description2");
MenuItem item3 = new MenuItem(3L, "Code3", "Description3");
MenuItem item4 = new MenuItem(4L, "Code4", "Description4");
나는 또한 MenuItem의 (상위/하위) 사이의 계층 적 관계를 표현 MenuHierarchy 개체의 무리가 있습니다
나는의 MenuItem 개체의 무리가 있습니다. 이 모델은있는 그대로 수정되었으므로 내가 가지고있는 것과 함께 작업해야합니다.
생성자는 - MenyHierarchy (ID, 부모, 자식, displayOrder)
MenuHierarchy hierarchy1 = new MenuHierarchy(1L, null, parent1);
MenuHierarchy hierarchy2 = new MenuHierarchy(2L, parent1, item1, 1);
MenuHierarchy hierarchy3 = new MenuHierarchy(3L, item1, item2, 2);
MenuHierarchy hierarchy4 = new MenuHierarchy(4L, item2, item3, 3);
MenuHierarchy hierarchy5 = new MenuHierarchy(5L, item3, item4, 4);
MenuHierarchy 객체는 null의 부모는 루트 노드 간주됩니다.
public class MenuNode implements GenericNode<MenuItem> {
private MenuItem data;
private List<GenericNode<MenuItem>> children;
public MenuNode(MenuItem data) {
this.data = data;
this.children = new ArrayList<GenericNode<MenuItem>>();
}
// Getters, setters
}
은 내가 지금까지 무엇을 설명 할 것이다 :
을이제 내가 생성 한 MenuNode 엔티티를 사용하여 구조 같은 트리에이 관계를 변환 할 스트림 API를 사용하여
/* This is the list of Root Menus (Menus which have no parent) */
List<MenuNode> rootNodes = new ArrayList<>();
List<MenuHierarchy> hierarchyList = Arrays.asList(hierarchy1, hierarchy2, hierarchy3, hierarchy4, hierarchy5);
/* This first stream adds a new root MenuNode object to the above list ordered by the hierarchy display order */
hierarchyList.parallelStream()
.filter((h) -> Objects.isNull(h.getParentMenu()))
.sorted((h, i) -> h.getDisplayOrder().compareTo(i.getDisplayOrder()))
.map(MenuHierarchy::getChildMenu)
.forEachOrdered((i) -> rootNodes.add(new MenuNode(i)));
/* This second one is where i've sort of failed...
What i need this to do is iterate over the menu hierarchies and for each non-root one
add it to the MenuNode children collection where MenuNode.data == MenyHeirarchy.parentMenu
Resulting in a tree of MenuItems...
*/
hierarchyList.stream()
.filter((h) -> Objects.nonNull(h.getParentMenu()))
.sorted((h, i) -> h.getDisplayOrder().compareTo(i.getDisplayOrder()))
.forEachOrdered((h) -> {
rootNodes.stream()
.filter((n) -> n.getData().equals(h.getParentMenu()))
.forEach((n) -> {
n.getChildren().add(new MenuNode(h.getChildMenu()));
});
});
이 전날 인 경우 당신은 모든 계층을 대표하지 않는 한이 잘 모르겠어요 ... 순간에 제대로 작동하지 않습니다 볼 수 있듯이 스트림으로 가능한가요?
모든 아이디어를 적극 권장합니다.
안녕하세요 미샤, 답변 해 주셔서 감사합니다. 그 결과 구조가리스트이 필요합니다. MenuTree는 트리입니다. 내가 가지고있는 문제는 children() 목록에 메뉴 항목을 추가하기 위해 MenuTree 객체를 찾기 위해 재귀를 수행하는 것입니다 ... –
Nick
내 의견에있는 해결책은 한 단계 깊숙이 간다 ... 그래서 추가하지 않습니다. 1 단계보다 깊은 어린이 목록에 항목을 추가하십시오. 재귀가 필요한 곳입니다. – Nick