業務邏輯 streamAPI運用 :java流式程式設計遞迴實現巢狀多級分類列表 詳細註釋

曹文哲發表於2020-12-11

詳細記錄java流式程式設計,運用streamAPI filter,map,collect方法
結合實戰舉例記錄這些運用

業務邏輯為 多級分類 比如 一級分類為 手機 二級分類 就有華為手機 蘋果手機
三級分類就有 P系列 mate系列 nova系列 iphone系列 等等

    @Override
    public List<CategoryEntity> listWithTree() {
        //1.查出所有分類
        List<CategoryEntity> entities = baseMapper.selectList(null);

        //2.組裝成父子樹形結構
            //2.1 找到所有一級分類 最頂部的父分類
        List<CategoryEntity> level1Menus = entities.stream().filter((categoryEntity) -> {
            return categoryEntity.getParentCid() == 0;//filter中的箭頭函式來篩選,在我資料庫中ParentCid == 0 的是一級分類
        }).map((menu)->{
            menu.setChildren(getChildren(menu,entities)); //map中對每一個實體物件來做對映,找到他們的子分類,見下方自定義方法
            return menu;
        }).sorted((menu1,menu2)->{
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());//解決空指標異常
        }).collect(Collectors.toList());//將結果轉化為list型別
        return level1Menus;
    }








//遞迴查詢所有選單的子選單
    private  List<CategoryEntity> getChildren(CategoryEntity root,List<CategoryEntity> all){
        List<CategoryEntity> children = all.stream().filter((entity) -> {
            return entity.getParentCid() == root.getCatId();
        }).sorted((menu1, menu2) -> {
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());//解決空指標異常
        }).map((entity) -> {
            //繼續遞迴找子選單
            entity.setChildren(getChildren(entity, all)); //繼續呼叫本方法,遞迴往下找
            return entity;
        }).collect(Collectors.toList());

        return children;
    }

相關文章