遞迴樹形查詢所有分類

LWing_17發表於2020-11-02

遞迴樹形查詢所有分類

    /**
     * 遞迴樹形查詢所有分類
     * @return
     */
    @Override
    public List<CategoryEntity> listWithTree() {

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

        //2.組裝成父子的樹形結構
        //2.1找到所有一級分類
        List<CategoryEntity> level1Menus =
                //設定查詢條件:父級分類Id==0就是所有一級分類
                entities.stream().filter(categoryEntity -> categoryEntity.getParentCid() == 0)
                        .map(menu -> {
                        	//設定子分類
                            menu.setChildren(getChildrens(menu, entities));
                            return menu;
                        })
                        .sorted((menu1,menu2) ->
                        		//升序排序
                                (menu1.getSort() == null? 0 : menu1.getSort()) - (menu2.getSort() == null? 0 : menu2.getSort()))
                        .collect(Collectors.toList());

        return level1Menus;
    }
    
   /**
     * 遞迴查詢所有子選單
     * @param root 當前選單
     * @param all 所有選單
     * @return 所有子選單
     */
    private List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all) {
        List<CategoryEntity> children =
                all.stream().filter(categoryEntity -> categoryEntity.getParentCid() == root.getCatId())
                        .map(categoryEntity -> {
                        	//這裡自己呼叫自己
                            categoryEntity.setChildren(getChildrens(categoryEntity, all));
                            return categoryEntity;
                        })
                        .sorted((menu1,menu2) ->
                                (menu1.getSort() == null? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort()))
                        .collect(Collectors.toList());
        return children;
    }

相關文章