Całkowicie się zablokowałem przy dość trywialnym problemie.
Mam API które zwraca liste elementów na danym poziomie drzewa, czyli pojedynczy response to lista takich obiektów
public class ElementDto {
private String id;
private String name;
private boolean leaf;
}
Jeżeli leaf == true
to znaczy, że pod spodem nie ma więcej poziomów drzewa, jeżeli jednak leaf == false
to znaczy, że dany element ma kilkoro dzieci, innymi słowy, mogę wziać jego id
i wykonać GET/api/elements/{id}
i dostanę kolejną listę elementów.
Problem w tym, że chciałbym od danego miejsca pobrać wszystko co pod spodem, czyli odtworzyć całe takie drzewo u siebie w aplikacji.
Stworzyłem więc prostą klasę, która reprezentuje pojedynczy element tego drzewa
public class TreeNode {
private final TreeNode parent;
private final String id;
private final String name;
private final List<TreeNode> children;
public static TreeNode root(String id, String name) {
return new TreeNode(null, id, name, new ArrayList<>());
}
public static TreeNode leaf(TreeNode parent, String id, String name) {
return new TreeNode(parent, id, name, new ArrayList<>());
}
public void addChildren(TreeNode node) {
this.children.add(node);
}
}
No i zacząłem pisać...
public void buildTree() {
final TreeNode root = buildTreeRoot();
addChildrenNodes(root);
root.getChildren()
.stream()
.map(TreeNode::getChildren)
.flatMap(Collection::stream)
.forEach(this::addChildrenNodes);
}
private TreeNode buildTreeRoot() {
final TreeNode root = TreeNode.root(ROOT_ID, ROOT_NAME);
final List<ElementDto> elements = client.callApi(ROOT_ID);
elements.forEach(element -> addChildrenNode(root, element));
return root;
}
private void addChildrenNodes(final TreeNode parent) {
parent.getChildren().forEach(child -> {
final List<ElementDto> elements = client.callApi(child.getId());
elements.forEach(element -> addChildrenNode(child, element));
});
}
private void addChildrenNode(final TreeNode parent, final ElementDto element) {
parent.addChildren(TreeNode.leaf(parent, element.getId(), element.getName()));
}
Tyle, że ja nie wiem ile poziomów tego drzewa tam faktycznie będzie, musze decydować na podstawie odpowiedzi z API czy już pobrałem całośc drzewa (czyli mam elementy z leaf == true
) i mogę przestać, czy jednak muszę iść głębiej. Problem w tym, że nie mam pojęcia jak to ugryźć, rekurencja, do{ ... } while()
? Jakie warunki postawić i jak decydować w którym miejscu aktualnie jestem? Jakiekolwiek wskazówki mile widziane, bo zwyczajnie mam blokadę :/