第一步:
构建树节点
@Data
public class Node {
private int id;
private int pid;
private String name;
private List<Node> sub = new ArrayList<>();
public Node(int id, int pid) {
this.id = id;
this.pid = pid;
}
public Node(int id, int pid, String name) {
this(id, pid);
this.name = name;
}
}
第二步:
使用流构建树
public class TreeUtil {
public static List<Node> buildTree(List<Node> nodes) {
//先选出非顶级的节点
List<Node> list = nodes.stream().filter(node -> node.getPid() != 0).collect(Collectors.toList());
//将这些非顶级节点的数据按pid进行分组
Map<Integer, List<Node>> sub = list.stream().collect(Collectors.groupingBy(node -> node.getPid()));
//循环设置对应的子节点(根据id = pid)
nodes.forEach(node -> node.setSub(sub.get(node.getId())));
//过滤掉父节点数据
List<Node> collect = nodes.stream().filter(node -> node.getPid() == 0).collect(Collectors.toList());
return collect;
}
}
第三步:测试
public class Main {
public static void main(String[] args) {
Node dennis = new Node(1, 0, "dennis");
Node calm = new Node(2, 0, "calm");
Node daughter = new Node(3, 1, "daughter");
Node grandson = new Node(4, 3, "grandson");
Node son = new Node(5, 2, "son");
List<Node> nodes = Arrays.asList(dennis, calm, daughter, son, grandson);
List<Node> tree = TreeUtil.buildTree(nodes);
System.out.println(JSON.toJSONString(tree));
}
}