把List<T>构建一颗树封装工具类

背景

背景不说了吧,开发中很多时候都遇得到构建一个 【树形关系】的数据场景

java 复制代码
id:1
parentId:0
  id:2
  parentId:1
    id:3
    parentId:2
    id:4
    parentId:2

像这样:

今天封装一个工具类,专门把 List<T> 转换为 Tree<T>

正文

假设我们有一个 Person 类

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements NodeOfId<Person>{

    private Long id;

    private Long parentId;

    private String name;

    private List<Person> children;
}

我们需要一个 构建树形 数据节点的 基类

java 复制代码
public interface NodeOfId<T> {
    Long getId();

    Long getParentId();

    void setChildren(List<T> children);
}

这个 基类 getId(),getPrentId() ,setChildren()都是可以更改的,根据你的类字段定义,只要能有构建出树形关系的字段就行

构建树封装工具类

java 复制代码
public class TreeUtil {

    /**
     * 构造list为树集合
     *
     * @param nodes
     * @param <T>
     * @return
     */
    public static <T extends NodeOfId<T>> List<T> buildTreeList(List<T> nodes) {
        Map<Long, List<T>> groupMap = nodes.stream().collect(Collectors.groupingBy(T::getParentId));
        return nodes.stream().filter(m -> m.getParentId() == 0).peek(
            (m) -> m.setChildren(getChildren(m, groupMap))
        ).collect(Collectors.toList());
    }

    /**
     * 递归查询子节点
     *
     * @param root     根节点
     * @param groupMap 将所有节点根据自己的父级ID进行分组
     * @return 根节点信息
     */
    private static <T extends NodeOfId<T>> List<T> getChildren(T root, Map<Long, List<T>> groupMap) {
        return groupMap.getOrDefault(root.getId(), new ArrayList<>()).stream().peek(
            (m) -> m.setChildren(getChildren(m, groupMap))
        ).collect(Collectors.toList());
    }
}

写个单元测试:

java 复制代码
    public static void test1() {
        List<Person> list = new ArrayList<>();

        Person person1 = new Person(1L, 0L, "A", null);

        Person person2 = new Person(2L, 1L, "B", null);

        Person person3 = new Person(3L, 2L, "C", null);

        Person person4 = new Person(4L, 2L, "D", null);

        list.add(person1);
        list.add(person2);
        list.add(person3);
        list.add(person4);
        List<Person> treeList = TreeUtil.buildTreeList(list);
        System.out.println(JSON.toJSONString(treeList));
    }

运行结果:

格式化看一下:

非常好用!!

相关推荐
一定要AK9 分钟前
Spring 入门核心笔记
java·笔记·spring
A__tao10 分钟前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao23 分钟前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏49429 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
wuxinyan1232 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书2 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队2 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能
洛_尘2 小时前
Java EE进阶:Linux的基本使用
java·java-ee
宸津-代码粉碎机2 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
MaCa .BaKa2 小时前
47-心里健康咨询平台/心理咨询系统
java·spring boot·mysql·tomcat·maven·intellij-idea·个人开发