java stream 获取集合中的上级节点
时间: 2023-06-18 17:02:14 浏览: 177
如果你的集合中有一个树形结构的数据,可以使用Java 8中的Stream API 来获取某个节点的所有上级节点。假设你的数据结构类似于这样:
```java
class Node {
private String id;
private String name;
private Node parent;
private List<Node> children;
// getters and setters
}
```
其中,每个节点有一个唯一的id和一个名称name,还有一个可选的parent节点和一个children列表。
现在,假设你有一个根节点root,你想要获取某个节点的所有上级节点,可以使用Stream API中的flatMap方法和递归来实现:
```java
public static List<Node> getAllParents(Node node) {
if (node.getParent() == null) {
return Collections.emptyList(); // 如果节点没有parent,返回一个空列表
}
List<Node> parents = new ArrayList<>();
parents.add(node.getParent());
parents.addAll(getAllParents(node.getParent())); // 递归获取所有上级节点
return parents;
}
// 获取某个节点的所有上级节点
public static List<Node> getAllParents(Node root, String nodeId) {
Node node = findNode(root, nodeId);
if (node == null) {
return Collections.emptyList(); // 如果节点不存在,返回一个空列表
}
return getAllParents(node);
}
// 查找某个节点
public static Node findNode(Node node, String nodeId) {
if (node.getId().equals(nodeId)) {
return node;
}
for (Node child : node.getChildren()) {
Node result = findNode(child, nodeId);
if (result != null) {
return result;
}
}
return null;
}
```
使用示例:
```java
Node root = new Node("1", "root", null, new ArrayList<>());
Node node1 = new Node("2", "node1", root, new ArrayList<>());
Node node2 = new Node("3", "node2", root, new ArrayList<>());
Node node11 = new Node("4", "node11", node1, new ArrayList<>());
Node node12 = new Node("5", "node12", node1, new ArrayList<>());
Node node21 = new Node("6", "node21", node2, new ArrayList<>());
List<Node> parents = getAllParents(root, "4"); // 获取节点4的所有上级节点
parents.forEach(parent -> System.out.println(parent.getName())); // 输出:node1, root
```
阅读全文