国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java返回前端樹形結(jié)構(gòu)數(shù)據(jù)(2種實現(xiàn)方式)

這篇具有很好參考價值的文章主要介紹了java返回前端樹形結(jié)構(gòu)數(shù)據(jù)(2種實現(xiàn)方式)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

0.思想

首先找到一級目錄(類別),然后從一級目錄(類別)遞歸獲取所有子目錄(類別),并組合成為一個“目錄樹”

1.普通實現(xiàn):controller層傳的是0層,就是一級目錄層,從這里開始往下遞歸。

/**
     * 遞歸查詢得到,分類目錄數(shù)據(jù);(針對前臺的)
     * @return
     */
    @Override
    public List<CategoryVO> listCategoryForCustomer() {
        //定義一個List,這個List就用來存在最終的查詢結(jié)果;即,這個List中的直接元素是:所有的parent_id=0,即type=1的,第1級別的目錄;
        List<CategoryVO> categoryVOList = new ArrayList<CategoryVO>();
 
        //我們額外創(chuàng)建recursivelyFindCategories()方法,去實現(xiàn)遞歸查詢的邏輯;
        //我們第一次遞歸查詢時,是先查一級目錄;(而一級目錄的parentId是0)
        //該方法第一個參數(shù)是:List<CategoryVO> categoryVOList:用來存放當(dāng)前級別對應(yīng)的,所有的下一級目錄數(shù)據(jù);
        //  PS:對于【最終返回給前端的List<CategoryVO> categoryVOList】來說,其所謂的下一級目錄就是:所有的parent_id=0,即type=1的,第1級別的目錄;
        //  PS:對于【所有的parent_id=0,即type=1的,第1級別的目錄;】來說,其categoryVOList就是【List<CategoryVO> childCategory屬性】,其是用來存放該級別對應(yīng)的所有的parent_id=1,即type=2的,第2級別的目錄;
        //  PS:對于【所有的parent_id=1,即type=2的,第2級別的目錄;】來說,其categoryVOList就是【List<CategoryVO> childCategory屬性】,其是用來存放該級別對應(yīng)的所有的parent_id=2,即type=3的,第3級別的目錄;
        //該方法的第二個參數(shù)是:當(dāng)前級別目錄的parent_id,即也就是當(dāng)前級別的上一級目錄的id;
        //即,第一個參數(shù)是【上一級別的List<CategoryVO> categoryVOList】;第二參數(shù)是【下一級別的parent_id,也就是當(dāng)前級別的id】;
        recursivelyFindCategories(categoryVOList, 0);
        return categoryVOList;
    }
 
    /**
     * 遞歸查詢分類目錄數(shù)據(jù)的,具體邏輯;;;其實就是,遞歸獲取所有目錄分類和子目錄分類,并組合稱為一個“目錄樹”;
     * @param categoryVOList :存放所有下級別分類目錄的數(shù)據(jù);
     * @param parentId :某級分類目錄的parentId;
     */
    private void recursivelyFindCategories(List<CategoryVO> categoryVOList, Integer parentId) {
        //首先,根據(jù)parent_id,查詢出所有該級別的數(shù)據(jù);(比如,第一次我們查詢的是parent_id=0,即type=1的,第1級別的目錄)
        List<Category> categoryList = categoryMapper.selectCategoriesByParentId(parentId);
        //然后,遍歷上面查詢的該級別的數(shù)據(jù);去嘗試查詢該級別數(shù)據(jù)的,下一級別的數(shù)據(jù);
        if (!CollectionUtils.isEmpty(categoryList)) {
            //遍歷所有查到的當(dāng)前級別數(shù)據(jù),把其放在對應(yīng)上級目錄的【List<CategoryVO> categoryVOList】中;
            for (int i = 0; i < categoryList.size(); i++) {
                //獲取到【上面查詢的,該級別數(shù)據(jù)中的,一條數(shù)據(jù)】,把其存儲到上級目錄的List<CategoryVO> childCategory屬性中;
                //自然,如果該級別是【parent_id=0,即type=1的,第1級別的目錄】,就是把其存儲在最頂級的、返回給前端的那個List<CategoryVO> categoryVOS中;
                Category category =  categoryList.get(i);
                CategoryVO categoryVo = new CategoryVO();
                BeanUtils.copyProperties(category, categoryVo);
                categoryVOList.add(categoryVo);
 
                //然后,這一步是關(guān)鍵:針對【每一個當(dāng)前級別的,目錄數(shù)據(jù)】去遞歸調(diào)用recursivelyFindCategories()方法;
                //自然,第一個參數(shù)是【當(dāng)前級別數(shù)據(jù)的,List<CategoryVO> childCategory屬性】:這是存放所有下級別目錄數(shù)據(jù)的;
                //第二個參數(shù)是【當(dāng)前級別數(shù)據(jù)的id】:這自然是下級別目錄數(shù)據(jù)的parent_id:
                recursivelyFindCategories(categoryVo.getChildCategory(), categoryVo.getId());
            }
        }
    }

2.stream流實現(xiàn):

  /**
     * 利用stream 流實現(xiàn)
     *
     */
    @Override
    public List<CategoryVO> listTree() {
        //1.查出所有分類
        List<Category> categories = categoryMapper.selectList();
        //轉(zhuǎn)成VO實體集合類
        List<CategoryVO> categoryVOS = new ArrayList<>();
        //ArrayListBeanUtils.copyProperties(categories,categoryVOS);
        //注意BeanUtils.copyProperties無法直接復(fù)制集合,要循環(huán);也可以單獨寫一個工具類,
        //后續(xù)補充轉(zhuǎn)換集合工具類
        for (Category category:categories
             ) {
            CategoryVO categoryVO = new CategoryVO();
            BeanUtils.copyProperties(category,categoryVO);
            categoryVOS.add(categoryVO);
        }
        //2.組裝成父子的樹形結(jié)構(gòu)
        //2.1 找到所有的一級分類
        List<CategoryVO> collect = categoryVOS.stream().filter(categoryVO -> {
            return categoryVO.getParentId() == 0;//一級分類就是父id=0是吧
        }).map(menu -> {
            menu.setChildCategory(getChildrens(menu,categoryVOS));
            return menu;
        }).sorted((menu1,menu2)->{//目錄排序
            return (menu1.getOrderNum() ==null?0:menu1.getOrderNum() )- (menu2.getOrderNum() == null?0:menu2.getOrderNum());
        }).collect(Collectors.toList());

        return collect;
    }

    //遞歸查找所有菜單的子菜單
    //root 當(dāng)前菜單,categoryList是菜單集合
    private List<CategoryVO> getChildrens(CategoryVO root, List<CategoryVO> categoryList) {
        //找出當(dāng)前菜單的子菜單
        List<CategoryVO> children = categoryList.stream().filter(categoryVO -> {
            //當(dāng)前菜單root的id等于(是)菜單集合中菜單的父Id,那就意味著當(dāng)前菜單就是子菜單
            //當(dāng)前菜單root的id,是其他菜單的父id,意味著當(dāng)前菜單的子菜單找到了唄
            return categoryVO.getParentId() == root.getId();
        }).map(categoryVO -> {
            //找到子菜單
            categoryVO.setChildCategory(getChildrens(categoryVO, categoryList));
            return categoryVO;
        }).sorted((menu1,menu2)->{
            //菜單的排序
            return (menu1.getOrderNum() ==null?0:menu1.getOrderNum() )- (menu2.getOrderNum() == null?0:menu2.getOrderNum());
        }).collect(Collectors.toList());

        return children;
    }

3.實體類集合專VO類集合的工具類

入?yún)槲粗愋偷膶嶓w集合與目標(biāo)集合的泛型字節(jié)碼類型(類名.class)

創(chuàng)建一個新集合用來存儲最終結(jié)果,泛型為目標(biāo)類型T

遍歷循環(huán)實體集合

通過Class獲取構(gòu)造器并創(chuàng)建新的實例

使用BeanUtils.copyProperties,將實體數(shù)據(jù)拷貝到目標(biāo)類型

將拷貝過數(shù)據(jù)的目標(biāo)類型添加到集合中文章來源地址http://www.zghlxwxcb.cn/news/detail-764416.html

public static <T> List<T> entityListToVOList(List<?> list, Class<T> clazz) {
    List<T> result = new ArrayList<>(list.size());
    for (Object source : list) {
        T target;
        try {
            target = clazz.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException();
        }
        BeanUtils.copyProperties(source, target);
        result.add(target);
    }
    return result;
}

到了這里,關(guān)于java返回前端樹形結(jié)構(gòu)數(shù)據(jù)(2種實現(xiàn)方式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java 數(shù)據(jù)結(jié)構(gòu)篇-二叉樹的深度優(yōu)先遍歷(實現(xiàn):遞歸方式、非遞歸方式)

    Java 數(shù)據(jù)結(jié)構(gòu)篇-二叉樹的深度優(yōu)先遍歷(實現(xiàn):遞歸方式、非遞歸方式)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? ?? 文章目錄 ? ? ? ? 1.0 二叉樹的說明 ? ? ? ? 1.1 二叉樹的實現(xiàn) ? ? ? ? 2.0 二叉樹的優(yōu)先遍歷說明 ? ? ? ? 3.0 用遞歸方式實現(xiàn)二叉樹遍歷 ? ? ? ? 3.1 用遞歸方式實現(xiàn)遍歷 - 前序遍歷 ? ? ? ? 3.2?用遞歸

    2024年02月05日
    瀏覽(24)
  • 后端java 如何返回給前端 JSON數(shù)據(jù)

    在上述代碼中,@ResponseBody注解用于將Java List對象轉(zhuǎn)換為JSON格式的數(shù)據(jù),并返回給前端。Spring會自動將List對象轉(zhuǎn)換為JSON格式的數(shù)組,其中每個元素都是一個JSON對象。在本例中,每個JSON對象都包含一個name屬性和一個age屬性。 Regenerate

    2024年02月15日
    瀏覽(22)
  • 超大量數(shù)據(jù),前端樹形結(jié)構(gòu)展示

    后端返回了50萬數(shù)據(jù),讓前端一次性展示成樹,之前用的ant-design-vue的tree插件,卡的死死的,經(jīng)過大量實驗,現(xiàn)發(fā)現(xiàn)三種樹可以支持如此大數(shù)量的數(shù)據(jù)。 目錄 第一種:vue-easy-tree 使用方式: 1.安裝插件 2.引入插件 全局引入 組件引入 3.使用 ?在使用虛擬滾動時,必須設(shè)置?no

    2024年01月21日
    瀏覽(27)
  • Java后端向前端返回文件流——實現(xiàn)下載功能!

    Java后端向前端返回文件流——實現(xiàn)下載功能!

    前端實現(xiàn)文件下載功能有多種方法,這里就不一一介紹,這里只介紹使用文件流下載的實現(xiàn)方法。 既然是文件流那就肯定需要給前端返回一堆二進(jìn)制編碼,作為后端就可以返回一個 OutPutStream 后端可以使用Java中servlet提供的 HttpServletResponse ,核心步驟是要設(shè)置響應(yīng)的數(shù)據(jù)類型

    2024年02月08日
    瀏覽(29)
  • Java后端向前端返回文件流——實現(xiàn)下載功能

    Java后端向前端返回文件流——實現(xiàn)下載功能

    前端實現(xiàn)文件下載功能有多種方法,這里就不一一介紹,這里只介紹使用文件流下載的實現(xiàn)方法。 既然是文件流那就肯定需要給前端返回一堆二進(jìn)制編碼,作為后端就可以返回一個 OutPutStream 后端可以使用Java中servlet提供的 HttpServletResponse ,核心步驟是要設(shè)置響應(yīng)的數(shù)據(jù)類型

    2024年02月11日
    瀏覽(26)
  • java返回前端實體類json數(shù)據(jù)時如何忽略某個屬性

    第一種方法 SpringBoot中忽略實體類中的某個屬性不返回給前端的方法:使用Jackson的方式://第一種方式,使用@JsonIgnore注解標(biāo)注在屬性上, 第二種方法 使用@JsonIgnoreProperties標(biāo)注在類上,可以忽略指定集合的屬性 注意 :同時使用@JsonProperty和@JsonIgnore時,可能會導(dǎo)致@JsonIgnore失效

    2024年02月13日
    瀏覽(24)
  • 線程方法接收參數(shù)和返回參數(shù),Java的兩種線程實現(xiàn)方式對比

    總所周知,Java實現(xiàn)多線程有兩種方式,分別是繼承Thread類和實現(xiàn)Runable接口,那么它們的區(qū)別是什么? 繼承 Thread 類: 通過繼承 Thread 類,你可以創(chuàng)建一個直接表示線程的類。你可以覆蓋 Thread 類中的 run 方法來定義線程的邏輯。當(dāng)調(diào)用 start 方法啟動線程時,會執(zhí)行該類中的

    2024年02月11日
    瀏覽(29)
  • java實現(xiàn)文件的上傳和下載,將文件流轉(zhuǎn)base64返回給前端

    上傳代碼 文件下載代碼 后端通過json拿到文件流的返回,我采用將文件流轉(zhuǎn)成base64返回給前臺,實現(xiàn)代碼如下:

    2024年02月13日
    瀏覽(37)
  • Java 高效構(gòu)建樹形結(jié)構(gòu)

    構(gòu)造樹形結(jié)構(gòu)通常使用遞歸遍歷元素,構(gòu)造元素的子集,直至子級全部構(gòu)建完成,返回父級,最終完成樹的構(gòu)建,這種方法的時間復(fù)雜度基本上在 O ( N 2 ) O(N^2) O ( N 2 ) ,數(shù)據(jù)量比較大的時候性能大幅下降,耗時嚴(yán)重。通過不斷實踐與優(yōu)化,得出一種可將構(gòu)造樹形結(jié)構(gòu)的性能提

    2024年02月16日
    瀏覽(24)
  • 解決:Java后端返回給前端的Date格式數(shù)據(jù)相差8小時的問題

    問題描述: 后端得到的數(shù)據(jù)是對的,但是返回給前端后,數(shù)據(jù)比原數(shù)據(jù)慢了8小時。 原因: json數(shù)據(jù)在返回瀏覽器端是會被spring-boot默認(rèn)的Jackson框架轉(zhuǎn)換,而Jackson框架默認(rèn)的時區(qū)GMT(相對于中國是少了8小時)。 解決: 在application.yml文件中,配置

    2024年04月16日
    瀏覽(163)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包