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 Function identityGetter; private final Function> parentIdentityGetter; private final BiConsumer addChildMethod; public TreeBuilder(Function identityGetter, Function> parentIdentityGetter, BiConsumer addChild) { this.identityGetter = identityGetter; this.parentIdentityGetter = parentIdentityGetter; this.addChildMethod = addChild; } public List buildTree(Collection nodes) { Map identityNodeMap = nodes.stream() .collect(Collectors.toMap(identityGetter, Function.identity(), (n1, n2) -> n1)); List result = nodes.stream() .filter(node -> !this.parentIdentityGetter.apply(node).isPresent()) .collect(Collectors.toList()); nodes.forEach(node -> parentIdentityGetter.apply(node).ifPresent(parentIdentity -> { if (identityNodeMap.containsKey(parentIdentity)) { @SuppressWarnings("unchecked") TSubTree parentNode = (TSubTree) identityNodeMap.get(parentIdentity); addChildMethod.accept(parentNode, node); } })); return result; } }