返回目錄(樹結(jié)構(gòu)構(gòu)造工具)

作為一個(gè)小外包...,記錄一下工作中常用的一些方法(tools),以便后續(xù)使用。
如果有小伙伴看,歡迎指點(diǎn)。但是不要指指點(diǎn)點(diǎn)。。。

這部分代碼本質(zhì)上是一個(gè)樹結(jié)構(gòu)生成工具。本質(zhì)是使用stream。這部分代碼更多是學(xué)習(xí)(我只用了若依的表結(jié)構(gòu),目前代碼需要對hutool有一點(diǎn)了解),運(yùn)用了stream和反射工具(hutool工具中)。
表結(jié)構(gòu)來自于若依管理系統(tǒng)。完整代碼點(diǎn)我,git。

核心代碼

 /**
     *
     * 造樹
     *
     * @param dataList     數(shù)據(jù)列表
     * @param parentFiled  父節(jié)點(diǎn)字段名
     * @param orderByField order by字段名
     * @param childField   子節(jié)點(diǎn)名
     * @return {@link List}<{@link T}>

     */
    public static <T> List<T> buildTree(List<T> dataList,  String rootField,String parentFiled, Object rootParentVal,
                                     String orderByField, String childField){
        // 1、篩選出所有父節(jié)點(diǎn)
        List<T> parentNodeList = dataList.stream().filter(
                item -> ObjectUtil.equals(ReflectUtil.getFieldValue(item, parentFiled).toString(), String.valueOf(rootParentVal))
        ).collect(Collectors.toList());
        // 2、父節(jié)點(diǎn)列表排序
        List<T> sortedList = ListUtil.sortByProperty(parentNodeList, orderByField);
        // 3、構(gòu)建樹形結(jié)構(gòu)的邏輯...
        getChildTree(sortedList, dataList, rootField, parentFiled, orderByField, childField);
        return sortedList;

    }
    
    /**
     *
     * 構(gòu)造樹
     * @param sortedList  排序完的List
     * @param parentFiled 父節(jié)點(diǎn)
     * @param dataList 原數(shù)據(jù) 所有
     */
    private static <T> void getChildTree(List<T> sortedList, List<T> dataList,  String rootField, String parentFiled, String orderByField, String childField) {
        for (T exportOrganization : sortedList) {
            List<T> subList = dataList.stream().filter(o -> Objects.nonNull(ReflectUtil.getFieldValue(o, parentFiled)))
                    .filter(o -> ObjectUtil.equals(StrUtil.toString(ReflectUtil.getFieldValue(o, parentFiled)), StrUtil.toString(ReflectUtil.getFieldValue(exportOrganization, rootField))))
                    .collect(Collectors.toList());
            // 排序
            List<T> ts = ListUtil.sortByProperty(subList, orderByField);
            ReflectUtil.setFieldValue(exportOrganization, childField, ts);
            if (CollectionUtil.isNotEmpty(ts)) {
                getChildTree(ts, dataList, rootField, parentFiled, orderByField, childField);
            }
        }
    }

效果

image.png

主要流程

1、獲取當(dāng)前用戶角色信息
2、根據(jù)角色獲取對應(yīng)菜單
3、根據(jù)菜單父子關(guān)系構(gòu)建樹結(jié)構(gòu)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容