JAVA8 两行代码实现ID-PID转树状结构
核心逻辑
-
通过stream对集合进行分组
准备知识:java8的收集器groupingBy 可以根据项目的一个属性的值对流中的项目分组,并将属性值作为结果Map的键,利用这个特性,可以按列表对象中的Pid属性进行分组。
Stream收集器groupingBy示意图:
-
第二步,遍历原集合,从Map中取出对应的List存进去。
测试用Entity
@Data
public class TestEntity {
/** 必备的结构属性 **/
//id
private int id;
//父id
private int pid;
//子集合
private List<TestEntity> children;
/** 私有属性,与业务相关的属性 **/
//名称
private String name;
}
代码(想直接用看这里)
- 单一顶层节点的实现方式
/**
* 将id-pid转为tree结构,单一顶层节点,顶层节点的id和pid不能相同
* @param pidList id-pid对象的列表
* @return tree结构对象
*/
public TestEntity buildTree(List<TestEntity> pidList){
//以pid为Key进行分组存入Map
Map<Integer,List<TestEntity>> pidListMap =
pidList.stream().collect(Collectors.groupingBy(TestEntity::getPid));
pidList.stream().forEach(item->item.setChildren(pidListMap.