List<TestAlertFileSystem>按属性聚合和成三级树形层级结构
时间: 2024-02-13 18:06:57 浏览: 71
假设List<TestAlertFileSystem>中的对象包含以下属性:id、name、parentId、size。
按照parentId进行属性聚合并将结果转化成三级树形层级结构的示例代码如下:
```java
// 定义一个辅助类,用于保存聚合结果
class AggregationResult {
private String parentId;
private List<TestAlertFileSystem> children;
// 省略getter和setter方法
}
// 对List<TestAlertFileSystem>按parentId进行聚合
Map<String, List<TestAlertFileSystem>> groupByParentId = list.stream()
.collect(Collectors.groupingBy(TestAlertFileSystem::getParentId));
// 将聚合结果转换成三级树形结构
List<AggregationResult> result = groupByParentId.keySet().stream()
.map(parentId -> {
AggregationResult r = new AggregationResult();
r.setParentId(parentId);
List<TestAlertFileSystem> children = groupByParentId.get(parentId);
if (children != null && !children.isEmpty()) {
Map<String, List<TestAlertFileSystem>> groupByParentId2 = children.stream()
.collect(Collectors.groupingBy(TestAlertFileSystem::getId));
List<TestAlertFileSystem> secondLevel = groupByParentId2.keySet().stream()
.map(id -> {
TestAlertFileSystem t = groupByParentId2.get(id).get(0);
List<TestAlertFileSystem> children2 = groupByParentId2.get(id);
if (children2 != null && !children2.isEmpty()) {
Map<String, List<TestAlertFileSystem>> groupByParentId3 = children2.stream()
.collect(Collectors.groupingBy(TestAlertFileSystem::getId));
List<TestAlertFileSystem> thirdLevel = groupByParentId3.keySet().stream()
.map(id2 -> groupByParentId3.get(id2).get(0))
.collect(Collectors.toList());
t.setChildren(thirdLevel);
}
return t;
})
.collect(Collectors.toList());
r.setChildren(secondLevel);
}
return r;
})
.collect(Collectors.toList());
```
以上代码中,先使用Java 8的流式操作对List<TestAlertFileSystem>按parentId进行属性聚合,得到一个Map<String, List<TestAlertFileSystem>>类型的聚合结果,其中Map的key是parentId,value是所有parentId为该值的TestAlertFileSystem对象列表。
接着,将聚合结果转换成三级树形结构。首先使用Map的keySet()方法获取所有不同的parentId值,对于每个parentId值,创建一个AggregationResult对象,并将其parentId设置为该值。然后获取所有parentId为该值的TestAlertFileSystem对象列表,并按id进行属性聚合,得到一个Map<String, List<TestAlertFileSystem>>类型的子聚合结果,其中Map的key是id,value是所有id为该值的TestAlertFileSystem对象列表。
接着,对于每个id值,创建一个TestAlertFileSystem对象,并将其设置为该id值的第二级节点。然后获取所有id为该值的TestAlertFileSystem对象列表,并按id进行属性聚合,得到一个Map<String, List<TestAlertFileSystem>>类型的子聚合结果,其中Map的key是id,value是所有id为该值的TestAlertFileSystem对象列表。然后再对于每个id值,创建一个TestAlertFileSystem对象,并将其设置为该id值的第三级节点,最后将所有第三级节点组成一个列表,设置到该id值的第二级节点的children属性中。
最后将所有AggregationResult对象组成一个列表,就得到了按parentId进行聚合并转化成三级树形结构的结果。
阅读全文