java将List数据转为树形结构数据——递归的应用

前言:

在日常的开发中,我们会经常用到树形结构数据。树形结构一般多用于查询包含多层父子类关系的数据,通过父级id和层级作为标识,使数据更加形象,从而进行树形数据的展示。

例如:公司的组织机构

数据库:

id————机构名称————机构编码————————上级机构编码
数据库

实体类:

@Data
@Entity
@Table(name = "t_third_org")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class TThirdOrg extends BaseEntity implements Serializable {
    private static final long serialVersionUID = -78345174257965697L;
	/**
     * id
     */
    private Long id;
    /**
     * 机构名称
     */
    private String orgName;
    /**
     * 机构编码
     */
    private String orgCd;
    /**
     * 上级机构编码
     */
    private String parentCd;
    ...
}

Controller层:

	 /**
     * 查询所有组织机构
     *
     * @return 出参
     */
    @ApiOperation(value = "查询所有组织机构")
    @PostMapping(value = "/queryList")
    List<TreeNode> queryList() {
        return thirdOrgService.queryList();
    }

Service层:

具体实现:用递归将数据分层

	/**
     * 查询所有组织机构
     *
     * @return 查询结果
     */
    @Override
    public List<TreeNode> queryList() {
        List<TreeNode> treeNodeList = this.tThirdOrgDao.queryList();
        // 调用递归方法 第一层的父级编码为0 此处可以根据具体需求更改
        List<TreeNode> nodeList = buildTree(treeNodeList, "0");
        return nodeList;
    }

	/**
     * 获取树形结构
     *
     * @param treeNodeList list数据
     * @param parentCd     父id
     * @return 树形结构
     */
    private List<TreeNode> buildTree(List<TreeNode> treeNodeList, String parentCd) {
        List<TreeNode> nodeList = new ArrayList<>();
        for (TreeNode node : treeNodeList) {
            if (parentCd.equals(node.getParentCd())) {
                // 递归构建子树
                List<TreeNode> children = buildTree(treeNodeList, node.getOrgCd());
                node.setChildren(children);
                nodeList.add(node);
            }
        }
        return nodeList;
    }

Dao层:

	/**
     * 查询所有组织机构
     *
     * @return 查询结果
     */
    @Query(value = "select * from t_third_org where is_deleted = 0", nativeQuery = true)
    List<TreeNode> queryList();

扩展:用stream流实现递归方法

    /**
     * 使用stream获取树形结构
     *
     * @param treeNodeList list数据
     * @param parentCd     父id
     * @return 树形结构
     */
    private static List<TreeNode> buildTree(List<TreeNode> treeNodeList, String parentCd) {
        // 使用stream获取树形结构
        List<TreeNode> nodeList = treeNodeList.stream()
                .filter(node -> {
                    return parentCd.equals(node.getParentCd());
                })
                .map((node) -> {
                            // 递归构建子树
                            node.setChildren(buildTree(treeNodeList, node.getOrgCd()));
                            return node;
                        }
                ).collect(Collectors.toList());
        return nodeList;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java知识技术分享

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值