package xyz.zhouxy.plusone.commons.util; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Collectors; public class TreeBuilder { private final Collection nodes; private final Function identityGetter; private final Function> parentIdentityGetter; private final BiConsumer addChildrenMethod; public TreeBuilder(Collection nodes, Function identityGetter, Function> parentIdentityGetter, BiConsumer addChildren) { this.nodes = nodes; this.identityGetter = identityGetter; this.parentIdentityGetter = parentIdentityGetter; this.addChildrenMethod = addChildren; } public List buildTree() { Map identityNodeMap = MoreCollections.toHashMap(nodes, identityGetter); List result = this.nodes.stream() .filter(node -> !this.parentIdentityGetter.apply(node).isPresent()) .collect(Collectors.toList()); for (T node : this.nodes) { Optional parentIdentity = parentIdentityGetter.apply(node); if (parentIdentity.isPresent() && identityNodeMap.containsKey(parentIdentity.get())) { T parentNode = identityNodeMap.get(parentIdentity.get()); addChildrenMethod.accept(parentNode, node); } } return result; } }