Java convierte datos de lista en datos de estructura de árbol: aplicación recursiva

Prefacio:

En el desarrollo diario, a menudo utilizamos datos de estructura de árbol. La estructura de árbol se usa generalmente para consultar datos que contienen relaciones padre-hijo de múltiples capas. El ID y el nivel del padre se usan como identificadores para hacer que los datos sean más vívidos y mostrar los datos del árbol.

Por ejemplo: estructura organizativa de la empresa.

base de datos:

id————Nombre de la organización————Código de organización——————Código de institución superior
base de datos

Clase de entidad:

@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;
    ...
}

Capa controladora:

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

Capa de servicio:

Implementación específica: utilice la recursividad para superponer datos

	/**
     * 查询所有组织机构
     *
     * @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;
    }

Capa de Dao:

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

Extensión: implementar métodos recursivos usando transmisiones

    /**
     * 使用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;
    }

Supongo que te gusta

Origin blog.csdn.net/qq_42547733/article/details/132857978
Recomendado
Clasificación