@FunctionalInterface
interface TreeBuilder {
List<ObjectConverter.Node> buildTree(List<ObjectConverter.Node> nodes, Integer parentID);
static TreeBuilder createTree() {
return (nodes, parentID) -> {
Map<Integer, List<ObjectConverter.Node>> map = groupByKey(nodes, ObjectConverter.Node::getParentId);
nodes.forEach(node -> node.children = map.getOrDefault(node.id, new ArrayList<>()));
return nodes.stream().filter(node -> node.parentId != null && node.parentId.equals(parentID)).collect(Collectors.toList());
};
}
static <E, K> Map<K, List<E>> groupByKey(List<E> list, Function<E, K> function) {
return CollUtil.isEmpty(list) ? new HashMap<>() : list.stream().collect(Collectors.groupingBy(function, HashMap::new, Collectors.toList()));
}
}
public class ObjectConverter {
@Data
@NoArgsConstructor
static class Node {
int id;
Integer parentId;
String name;
List<Node> children;
public Node(int id, Integer parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
this.children = new ArrayList<>();
}
public Function<Node,Integer> getParentId1() {
return Node::getParentId;
}
}
public static void main(String[] args) {
Node node = new Node();
Function<Node, Integer> parentId = node.getParentId1();
List<ObjectConverter.Node> list = new ArrayList<>();
list.add(new ObjectConverter.Node(1, 0, "Node 1"));
list.add(new ObjectConverter.Node(2, 1, "Node 1.1"));
list.add(new ObjectConverter.Node(3, 2, "Node 1.2"));
list.add(new ObjectConverter.Node(4, 2, "Node 1.1.1"));
list.add(new ObjectConverter.Node(5, 3, "Node 1.2.1"));
TreeBuilder treeBuilder = TreeBuilder.createTree();
List<ObjectConverter.Node> tree = treeBuilder.buildTree(list, 0);
System.out.println(JSONObject.toJSONString(tree));
}
}