java利用遞歸實(shí)現(xiàn)類別樹(shù)示例代碼
在瀏覽淘寶,京東等各大商場(chǎng)的時(shí)候會(huì)發(fā)現(xiàn)首頁(yè)一般都是商品分類,并且這個(gè)商品分類都是層級(jí)關(guān)系。下圖以天貓商場(chǎng)為例,分為了三層的樹(shù)狀結(jié)構(gòu)!!!
那么這種的類別樹(shù)是怎么實(shí)現(xiàn)的呢?話不多說(shuō)直接上代碼:
1.首先我們新建一張商品類別表并維護(hù)所需數(shù)據(jù):
2.創(chuàng)建商品類別實(shí)體
@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 = "層級(jí)") private Integer catLevel; @ApiModelProperty(value = "是否顯示[0-不顯示,1顯示]") private Integer showStatus; @ApiModelProperty(value = "排序") private Integer sort; @ApiModelProperty(value = "圖標(biāo)地址") private String icon; @ApiModelProperty(value = "計(jì)量單位") private String productUnit; @ApiModelProperty(value = "商品數(shù)量") private String productCount; }
3.創(chuàng)建類別樹(shù)返回實(shí)體
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel("商品類別返回對(duì)象") public class OrdersCategoryVo extends OrdersCategory implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "子類別樹(shù)") List<OrdersCategoryVo> childrenCategoryList; }
4.遞歸邏輯代碼編寫
/** * 獲取商品類別樹(shù) * @return */ @Override public List<OrdersCategoryVo> getCategoryTree() { //查出分類表所有數(shù)據(jù) List<OrdersCategoryVo> entityList = categoryMapper.getCategoryTreeAll(); //查詢出所有的一級(jí)分類數(shù)據(jù). 使用stream的api List<OrdersCategoryVo> firstEntityList = entityList.stream() .filter(categoryVo -> categoryVo.getParentCid().intValue() == 0) .map((menu) -> { //傳遞當(dāng)前的商品分類, 和所有的分類,遞歸查詢出每個(gè)一級(jí)分類下的子分類 menu.setChildrenCategoryList( getChildrens(menu,entityList)); return menu; } ).collect(Collectors.toList()); return firstEntityList; } /** * 遞歸查詢子父類 * @param root 當(dāng)前節(jié)點(diǎn)的父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; }
關(guān)于實(shí)現(xiàn)邏輯,代碼上都有注釋,這里簡(jiǎn)單講一下案例中stream的幾個(gè)方法
stream().filter:過(guò)濾,根據(jù)條件過(guò)濾掉集合中的元素
stream().map:映射,操作集合中的元素并返回新的元素
stream().collect(Collectors.toList()):結(jié)束操作,stream流無(wú)存儲(chǔ),所以需要返回操作結(jié)束后的集合
5.前端使用Element的樹(shù)形控件渲染數(shù)據(jù)
<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.啟動(dòng)項(xiàng)目看效果
初學(xué)前端,做的比較簡(jiǎn)單。。。。。。。。。。。。。
到此這篇關(guān)于java利用遞歸實(shí)現(xiàn)類別樹(shù)的文章就介紹到這了,更多相關(guān)java遞歸實(shí)現(xiàn)類別樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章

Springboot導(dǎo)入本地jar后 打包依賴無(wú)法加入的解決方案

Java設(shè)置token有效期的5個(gè)應(yīng)用場(chǎng)景(雙token實(shí)現(xiàn))

JDBC使用游標(biāo)實(shí)現(xiàn)分頁(yè)查詢的方法

IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟(圖文教程)

Jackson處理Optional時(shí)遇到問(wèn)題的解決與分析