java利用遞歸實現(xiàn)類別樹示例代碼
在瀏覽淘寶,京東等各大商場的時候會發(fā)現(xiàn)首頁一般都是商品分類,并且這個商品分類都是層級關系。下圖以天貓商場為例,分為了三層的樹狀結構?。。?/p>

那么這種的類別樹是怎么實現(xiàn)的呢?話不多說直接上代碼:
1.首先我們新建一張商品類別表并維護所需數(shù)據(jù):

2.創(chuàng)建商品類別實體
@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 = "商品數(shù)量")
private String productCount;
}
3.創(chuàng)建類別樹返回實體
@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() {
//查出分類表所有數(shù)據(jù)
List<OrdersCategoryVo> entityList = categoryMapper.getCategoryTreeAll();
//查詢出所有的一級分類數(shù)據(jù). 使用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 當前節(jié)點的父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;
}
關于實現(xiàn)邏輯,代碼上都有注釋,這里簡單講一下案例中stream的幾個方法
stream().filter:過濾,根據(jù)條件過濾掉集合中的元素
stream().map:映射,操作集合中的元素并返回新的元素
stream().collect(Collectors.toList()):結束操作,stream流無存儲,所以需要返回操作結束后的集合
5.前端使用Element的樹形控件渲染數(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.啟動項目看效果

初學前端,做的比較簡單。。。。。。。。。。。。。
到此這篇關于java利用遞歸實現(xiàn)類別樹的文章就介紹到這了,更多相關java遞歸實現(xiàn)類別樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java overload和override的區(qū)別分析
SpringBoot之如何搭建SpringBoot+Maven項目
SpringBoot中JPA實現(xiàn)Sort排序的三種方式小結

