TreeUtil 基本用法 便捷构建树形结构

TreeUtil 构建树形结构的基本用法

每次构建树形结构都重复递归代码

可以了解一下hutool 的TreeUtil
    @RequestMapping(value = "testTree")
    public String testTree() {

        //调库找出顶级节点
        DmFunctionLocationBean topNode = ADOConnection.runTask(factory -> {
            return factory.getMapper(DmFunctionLocationMapper.class).queryFirstByParentId(null);
        }, DmFunctionLocationBean.class);

        if (topNode == null) {
            return "";
        }

        //调库找出所有要组建数的节点
        List<DmFunctionLocationBean> dblist = ADOConnection.runTask(factory -> {
            return factory.getMapper(DmFunctionLocationMapper.class).queryAll();
        }, List.class);

        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        // 自定义属性名 都要默认值的
        treeNodeConfig.setWeightKey("order");
        // 以下两个字段是上下级关系字段
        treeNodeConfig.setIdKey("rid");
        treeNodeConfig.setParentIdKey("parentId");
        // 最大递归深度
        treeNodeConfig.setDeep(3);

        //转换器 注意这个 topNode.getId() 为 最顶级节点 id。 后面枝叶都依据此扩展
//        List<Tree<String>> treeList = TreeUtil.build(dblist, "03000000000001", treeNodeConfig,
        List<Tree<String>> treeList = TreeUtil.build(dblist, topNode.getId(), treeNodeConfig,
                (treeNode, node) -> {
                    node.setId(treeNode.getId());
                    node.setParentId(treeNode.getParentId());
                    node.setWeight(treeNode.getSortNo());	//排序权重
                    node.setName(treeNode.getFlName());
                    // 扩展属性 ...
                    node.putExtra("id", treeNode.getId());
                    node.putExtra("dispatchNo", treeNode.getDispatchNo());
                    node.putExtra("dataFrom", treeNode.getDataFrom());
                    
                    // 如果不想一个个putExtra,可以直接Bean 转 Map 遍历赋值 
                        Map<String, Object> map = BeanUtil.beanToMap(treeNode);
                        for (Map.Entry<String, Object> entry : map.entrySet()) {
                            node.putExtra(entry.getKey() ,entry.getValue());
                        }

                });

        //补充根节点(顶级节点)基本能信息
        Tree tree = new Tree(treeNodeConfig);
        tree.setName("顶级节点");
        tree.setId(topNode.getId());
        tree.setChildren(treeList);                             //上面构建的树 放进来.   treeList可以对其他库树形结构进行拼接
        tree.putExtra("id", topNode.getId());
        tree.putExtra("dispatchNo", topNode.getDispatchNo());
        tree.putExtra("dataFrom", topNode.getDataFrom());


        // 把树形结果 通过 json 转换 成 集合  ,这种适合做数据通过表格 数据处理 插库
        List<DmFunctionLocationBeanVo> jsonToList = FastJsonUtils.getJsonToList(FastJsonUtils.getBeanToJson(list), DmFunctionLocationBeanVo.class);

        List<DmFunctionLocationBean> insertlist = new ArrayList();
        recursionEq(jsonToList, insertlist);
        System.out.println(insertlist.size());

        return FastJsonUtils.getBeanToJson(tree);
    }
    // 正序递归 实体
    public void recursionEq(List<DmFunctionLocationBeanVo> jsonToList, List<DmFunctionLocationBean> insertlist) {
        for (DmFunctionLocationBeanVo vo: jsonToList) {
            DmFunctionLocationBean convert = Convert.convert(DmFunctionLocationBean.class, vo);
            insertlist.add(convert);
            if (CollUtil.isNotEmpty(vo.getChildren())) {
                recursionEq(vo.getChildren(), insertlist);
            }
        }
    }
用到的依赖 和 公用方法
调库代码自己重写
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.15</version>
        </dependency>
       
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class FastJsonUtils {


    /**
     * 功能描述:把JSON数据转换成指定的java对象
     *
     * @param jsonData JSON数据
     * @param clazz    指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getJsonToBean(String jsonData, Class<T> clazz) {
        return JSON.parseObject(jsonData, clazz);
    }

    /**
     * 功能描述:把java对象转换成JSON数据
     *
     * @param object java对象
     * @return JSON数据
     */
    public static String getBeanToJson(Object object) {
        return JSON.toJSONString(object);
    }

    /**
     * 功能描述:把JSON数据转换成指定的java对象列表
     *
     * @param jsonData JSON数据
     * @param clazz    指定的java对象
     * @return List<T>
     */
    public static <T> List<T> getJsonToList(String jsonData, Class<T> clazz) {
        return JSON.parseArray(jsonData, clazz);
    }

    /**
     * 功能描述:把JSON数据转换成较为复杂的List<Map<String, Object>>
     *
     * @param jsonData JSON数据
     * @return List<Map < String, Object>>
     */
    public static List<Map<String, Object>> getJsonToListMap(String jsonData) {
        return JSON.parseObject(jsonData, new TypeReference<List<Map<String, Object>>>() {
        });
    }

    /**
     * 泛型集合 转 hashmap集合
     * @param reportDataList
     * @return
     */
    public static ArrayList<HashMap<String, String>> convertToDataList(List<?> reportDataList) {
        String json = "";
        try {
            json = new ObjectMapper().writeValueAsString(reportDataList);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        System.out.println(json);
        TypeToken<ArrayList<HashMap<String, String>>> type = new TypeToken<ArrayList<HashMap<String, String>>>() {
        };
        ArrayList<HashMap<String, String>> dataList = new Gson().fromJson(json, type.getType());
        return dataList;
    }

}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值