java使用jdk8特性级联查询树代码
时间: 2023-08-03 14:26:49 浏览: 112
以下是一个简单的使用 JDK 8 特性进行级联查询树的例子:
```java
public class TreeNode {
private Long id;
private Long parentId;
private String name;
private List<TreeNode> children = new ArrayList<>();
// 构造函数、getter 和 setter 方法省略
// 添加子节点
public void addChild(TreeNode node) {
children.add(node);
}
// 获取子节点
public List<TreeNode> getChildren() {
return children;
}
// 级联查询树
public static List<TreeNode> buildTree(List<TreeNode> nodes) {
Map<Long, TreeNode> nodeMap = nodes.stream().collect(Collectors.toMap(TreeNode::getId, Function.identity()));
List<TreeNode> rootNodes = new ArrayList<>();
for (TreeNode node : nodes) {
Long parentId = node.getParentId();
if (parentId == null) {
rootNodes.add(node);
} else {
TreeNode parent = nodeMap.get(parentId);
parent.addChild(node);
}
}
return rootNodes;
}
}
```
使用上述代码,我们可以将一个节点列表转换为树形结构。例如,如果我们有以下节点列表:
```java
List<TreeNode> nodes = Arrays.asList(
new TreeNode(1L, null, "A"),
new TreeNode(2L, 1L, "B"),
new TreeNode(3L, 1L, "C"),
new TreeNode(4L, 2L, "D"),
new TreeNode(5L, 2L, "E"),
new TreeNode(6L, 3L, "F")
);
```
我们可以使用 `TreeNode.buildTree(nodes)` 方法将其转换为树形结构:
```java
List<TreeNode> rootNodes = TreeNode.buildTree(nodes);
System.out.println(rootNodes);
```
输出结果为:
```
[TreeNode(id=1, parentId=null, name=A, children=[TreeNode(id=2, parentId=1, name=B, children=[TreeNode(id=4, parentId=2, name=D, children=[]), TreeNode(id=5, parentId=2, name=E, children=[])]) TreeNode(id=3, parentId=1, name=C, children=[TreeNode(id=6, parentId=3, name=F, children=[])])])]
```
这个例子中,我们使用了 Java 8 的 Lambda 表达式和 Stream API 来简化代码。其中,`Collectors.toMap()` 方法将节点列表转换为一个以节点 ID 为键、节点对象为值的 Map,方便后续查找父节点。然后,我们遍历节点列表,将每个节点添加到其父节点的 `children` 列表中,最终返回所有根节点。
阅读全文