将数组整理成树结构

树结构实体类


/**
 * @Author: DMG Cai
 * @Date: 2021/2/18 13:57
 */
public class TreeEntity {

    /**
     * 节点名称
     */
    private String title;

    /**
     * 节点id
     */
    private Long key;

    /**
     * 父节点id
     */
    private Long parentKey;

    /**
     *  排序顺序
     */
    private Integer sortOrder;
    /**
     * 子节点集
     */
    private List<TreeEntity> children;
}

转成树结构


	// 根节点父id
	private static final long ROOT_NODE_ID = 0;
	
	/**
	 * 整理成树结构
	 * @author: DMG Cai at 2021/8/10 11:02
	 * @param treeEntityList
	 * @param parentKey 父id
	 * @param nodeFu 给node 的属性赋值  key parentKey title sortOrder 等 及其子类扩展属性
	 * @return:
	 */
	public static <T, R extends TreeEntity> List<R> buildTree(List<T> treeEntityList, Function<T, Long> parentKey, Function<T, R> nodeFu) {
		return buildTree(ROOT_NODE_ID, treeEntityList, parentKey, nodeFu);
	}

	/**
	 * 整理成树结构
	 * @author: DMG Cai at 2021/8/10 12:03
	 * @param parentId 父id
	 * @param treeEntityList 数据集合
	 * @param parentKey 获取 数据的 父id值
	 * @param nodeFu 给node 的属性赋值 key parentKey title sortOrder 等 及其子类扩展属性
	 * @return:
	 */
	public static <T, R extends TreeEntity> List<R> buildTree(Long parentId, List<T> treeEntityList, Function<T, Long> parentKey, Function<T, R> nodeFu) {
		if (parentId == null) {
			throw new BusinessException("父id为空");
		}
		if (CollectionUtils.isEmpty(treeEntityList)) {
			return Collections.emptyList();
		}
		return treeEntityList.stream()
				.filter(te -> parentKey.apply(te).equals(parentId))
				.map(te -> {
					R node = nodeFu.apply(te);
					List<R> rList = buildTree(node.getKey(), treeEntityList, parentKey, nodeFu);
					node.setChildren(rList.isEmpty() ? null : (List<TreeEntity>) rList);
					return node;
				}).sorted(Comparator.comparing(TreeEntity::getSortOrder)).collect(Collectors.toList());
	}

示例

// 部门实体类
public class SysDepartment {
	/**
     *  部门id
     */
	private Long id;

	/**
     *  父部门id
     */
	private Long parentId;
	/**
     *  部门代码
     */
	private String departmentCode;
	/**
     *  部门名称
     */
	private String departmentName;
	/**
     *  层级
     */
	private Integer level;
	/**
     *  排序
     */
	private Integer sortOrder;
}


	// 将部门集合整理成树结构
    private List<TreeEntity> getTreeNodes(List<SysDepartment> departmentList) {

        return TreeUtils.buildTree(departmentList, SysDepartment::getParentId, department -> {
            TreeEntity node = new TreeEntity();
            node.setTitle(department.getDepartmentName());
            node.setKey(department.getId());
            node.setParentKey(department.getParentId());
            node.setSortOrder(department.getSortOrder());
            return node;
        });
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值