java利用遞迴實現類別樹示例程式碼
阿新 • • 發佈:2020-12-17
在瀏覽淘寶,京東等各大商場的時候會發現首頁一般都是商品分類,並且這個商品分類都是層級關係。下圖以天貓商場為例,分為了三層的樹狀結構!!!
那麼這種的類別樹是怎麼實現的呢?話不多說直接上程式碼:
1.首先我們新建一張商品類別表並維護所需資料:
2.建立商品類別實體
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel("商品類別表") public class OrdersCategory implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "類別主鍵") @TableId(value = "id",type = IdType.ASSIGN_ID) private Integer catId; @ApiModelProperty(value = "分類名稱") private String name; @ApiModelProperty(value = "父分類id") private Integer parentCid; @ApiModelProperty(value = "層級") private Integer catLevel; @ApiModelProperty(value = "是否顯示[0-不顯示,1顯示]") private Integer showStatus; @ApiModelProperty(value = "排序") private Integer sort; @ApiModelProperty(value = "圖示地址") private String icon; @ApiModelProperty(value = "計量單位") private String productUnit; @ApiModelProperty(value = "商品數量") private String productCount; }
3.建立類別樹返回實體
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel("商品類別返回物件") public class OrdersCategoryVo extends OrdersCategory implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "子類別樹") List<OrdersCategoryVo> childrenCategoryList; }
4.遞迴邏輯程式碼編寫
/** * 獲取商品類別樹 * @return */ @Override public List<OrdersCategoryVo> getCategoryTree() { //查出分類表所有資料 List<OrdersCategoryVo> entityList = categoryMapper.getCategoryTreeAll(); //查詢出所有的一級分類資料. 使用stream的api List<OrdersCategoryVo> firstEntityList = entityList.stream() .filter(categoryVo -> categoryVo.getParentCid().intValue() == 0) .map((menu) -> { //傳遞當前的商品分類,和所有的分類,遞迴查詢出每個一級分類下的子分類 menu.setChildrenCategoryList( getChildrens(menu,entityList)); return menu; } ).collect(Collectors.toList()); return firstEntityList; } /** * 遞迴查詢子父類 * @param root 當前節點的父id * @param all 所有的商品分類 * @return */ private List<OrdersCategoryVo> getChildrens(OrdersCategoryVo root,List<OrdersCategoryVo> all) { List<OrdersCategoryVo> childrenList = all.stream() .filter(categoryVo -> categoryVo.getParentCid().intValue() == root.getCatId().intValue()) .map(categoryVo -> { //子選單可能還有子選單,因此遞迴查詢,查詢出子選單 categoryVo.setChildrenCategoryList(getChildrens(categoryVo,all)); return categoryVo; }).collect(Collectors.toList()); return childrenList; }
關於實現邏輯,程式碼上都有註釋,這裡簡單講一下案例中stream的幾個方法
stream().filter:過濾,根據條件過濾掉集合中的元素
stream().map:對映,操作集合中的元素並返回新的元素
stream().collect(Collectors.toList()):結束操作,stream流無儲存,所以需要返回操作結束後的集合
5.前端使用Element的樹形控制元件渲染資料
<template> <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree> </template> <script> import { getCategoryTree } from '@/api/category' export default { data() { return { data: [],defaultProps: { children: 'childrenCategoryList',label: 'name' } } },created() { this.getData(); },methods: { handleNodeClick () { },getData() { getCategoryTree() .then(response => { this.data = response.data.data.list }) .catch(() => { this.data = [] }) } }
6.啟動專案看效果
初學前端,做的比較簡單。。。。。。。。。。。。。
到此這篇關於java利用遞迴實現類別樹的文章就介紹到這了,更多相關java遞迴實現類別樹內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!