现在有一个集合,里面放了多个相同对象,对象的属性为id,父id,name,请用Steam流得到一个树形结构对象
时间: 2024-03-02 20:51:35 浏览: 24
可以使用Java 8中的Stream API来实现。假设已经有一个名为`list`的List集合,其元素为包含id、父id和name属性的对象。
首先定义一个树形结构对象`TreeNode`,包含id、name和子节点列表:
```
class TreeNode {
private int id;
private String name;
private List<TreeNode> children;
// 构造函数和getter/setter省略
}
```
然后使用以下代码生成树形结构对象:
```
List<TreeNode> tree = list.stream()
.collect(Collectors.groupingBy(obj -> obj.getParentId())) // 按父id分组
.getOrDefault(0, Collections.emptyList()) // 获取根节点
.stream()
.peek(root -> buildTree(root, list)) // 递归构建子节点
.collect(Collectors.toList());
// 递归构建子节点
private static void buildTree(TreeNode parent, List<Object> list) {
List<TreeNode> children = list.stream()
.filter(obj -> obj.getParentId() == parent.getId())
.map(obj -> new TreeNode(obj.getId(), obj.getName(), null))
.collect(Collectors.toList());
parent.setChildren(children);
children.forEach(child -> buildTree(child, list));
}
```
解释一下以上代码:
- 第一行使用`Collectors.groupingBy`方法按父id分组,将具有相同父id的对象放到同一个List中。
- 第二行使用`getOrDefault`方法获取根节点,即父id为0的对象。
- 第三行使用`peek`方法递归构建树形结构。`peek`方法会保留Stream中的元素,所以这里不会改变原Stream的内容。
- 第四行是递归构建子节点的方法。首先使用`filter`方法过滤出所有父id等于当前节点id的对象,然后使用`map`方法将它们转换成`TreeNode`对象。最后使用`forEach`方法递归构建子节点。
最终得到的`tree`对象即为树形结构对象。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)