后端返回树结构

出参结构

java 复制代码
@Getter
@Setter
public class TreeResponse implements Serializable {
    // 主键
    private Long id;
    // 父级节点
    private Long parentId;
    // 层级
    private Byte layer;
    // 编码
    private String docCode;
    // 名称
    private String docName;
    // 子节点
    private List<TreeResponse> childNode;
}

方案一:生撸

java 复制代码
public Result<List<TreeResponse>> listTreeData(String code) {
    // 查询全量数据
    List<TreeResponse> tempTreeResponse = new ArrayList<>();
    // 树节点转换
    return Result.success(convertTreeStructure(tempTreeResponse));
}

/**
 * 树形转换
 *
 * @param tempTreeResponse 档案信息
 * @return 档案信息-树
 */
private List<TreeResponse> convertTreeStructure(List<TreeResponse> tempTreeResponse) {
    // 获取第一层级
	List<TreeResponse> treeResponse = tempTreeResponse.stream()
			.filter(value -> Objects.isNull(value.getParentId()))
			.collect(Collectors.toList());
    // 获取非第一层级数据,并以父级ID进行分组
	Map<Long, List<TreeResponse>> notFirstLayerData = tempTreeResponse.stream()
			.filter(value -> Objects.nonNull(value.getParentId()))
			.collect(Collectors.groupingBy(TreeResponse::getParentId));
	treeResponse.forEach(data -> setChildData(data, notFirstLayerData));
	return treeResponse;
}

/**
 * 设置子节点
 *
 * @param parentInfo        父节点信息
 * @param notFirstLayerData 非首节点信息
 */
private void setChildData(TreeResponse parentInfo, Map<Long, List<TreeResponse>> notFirstLayerData) {
	List<TreeResponse> childData = notFirstLayerData.get(parentInfo.getId());
	if (CollectionUtils.isNotEmpty(childData)) {
		parentInfo.setChildNode(childData);
		childData.forEach(data -> setChildData(data, notFirstLayerData));
	}
}

方案二:Hutool

java 复制代码
//配置
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名 都要默认值的
treeNodeConfig.setWeightKey("order");
treeNodeConfig.setIdKey("rid");
// 最大递归深度
treeNodeConfig.setDeep(3);

//转换器 (含义:找出父节点为字符串零的所有子节点, 并递归查找对应的子节点, 深度最多为 3)
List<Tree<String>> treeNodes = TreeUtil.<TreeNode, String>build(nodeList, "0", treeNodeConfig,
		(treeNode, tree) -> {
			tree.setId(treeNode.getId());
			tree.setParentId(treeNode.getParentId());
			tree.setWeight(treeNode.getWeight());
			tree.setName(treeNode.getName());
			// 扩展属性 ...
			tree.putExtra("extraField", 666);
			tree.putExtra("other", new Object());
		});
相关推荐
Ripple123128 小时前
数据结构:顺序表与链表
数据结构·链表
自信的小螺丝钉17 小时前
Leetcode 876. 链表的中间结点 快慢指针
算法·leetcode·链表·指针
天选之女wow2 天前
【代码随想录算法训练营——Day4】链表——24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II
数据结构·算法·leetcode·链表
KarrySmile2 天前
Day12--HOT100--23. 合并 K 个升序链表,146. LRU 缓存,94. 二叉树的中序遍历
数据结构·链表·二叉树·递归·hot100·lru·灵茶山艾府
Miraitowa_cheems2 天前
LeetCode算法日记 - Day 34: 二进制求和、字符串相乘
java·算法·leetcode·链表·职场和发展
今后1232 天前
【数据结构】带哨兵位双向循环链表
数据结构·链表
ShineWinsu2 天前
对于单链表相关经典算法题:206. 反转链表及876. 链表的中间结点的解析
java·c语言·数据结构·学习·算法·链表·力扣
j_xxx404_2 天前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
自信的小螺丝钉3 天前
Leetcode 206. 反转链表 迭代/递归
算法·leetcode·链表
豆沙沙包?3 天前
2025年- H118-Lc86. 分隔链表(链表)--Java版
java·数据结构·链表