亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java利用遞歸實(shí)現(xiàn)類別樹(shù)示例代碼

 更新時(shí)間:2020年12月17日 09:23:33   作者:去撒哈拉當(dāng)海盜  
這篇文章主要給大家介紹了關(guān)于java利用遞歸實(shí)現(xiàn)類別樹(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在瀏覽淘寶,京東等各大商場(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)文章希望大家以后多多支持腳本之家!

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

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

    這篇文章主要介紹了Springboot導(dǎo)入本地jar后 打包依賴無(wú)法加入的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java多線程讀取多個(gè)文件的方法

    java多線程讀取多個(gè)文件的方法

    這篇文章主要為大家詳細(xì)介紹了java多線程讀取多個(gè)文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java并發(fā)系列之Semaphore源碼分析

    Java并發(fā)系列之Semaphore源碼分析

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之Semaphore源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java中Spring獲取bean方法小結(jié)

    Java中Spring獲取bean方法小結(jié)

    Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,如何在程序中獲取Spring配置的bean呢?下面通過(guò)本文給大家介紹Java中Spring獲取bean方法小結(jié),對(duì)spring獲取bean方法相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • Java設(shè)置token有效期的5個(gè)應(yīng)用場(chǎng)景(雙token實(shí)現(xiàn))

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

    Token最常見(jiàn)的應(yīng)用場(chǎng)景之一就是身份驗(yàn)證,本文主要介紹了Java設(shè)置token有效期的5個(gè)應(yīng)用場(chǎng)景(雙token實(shí)現(xiàn)),具有一定的參考價(jià)值,感興趣的可以來(lái)了解一下
    2024-04-04
  • JDBC使用游標(biāo)實(shí)現(xiàn)分頁(yè)查詢的方法

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

    這篇文章主要介紹了JDBC使用游標(biāo)實(shí)現(xiàn)分頁(yè)查詢的方法,實(shí)例分析了jdbc查詢過(guò)程中游標(biāo)的使用及查詢分頁(yè)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • 詳解如何在Java中實(shí)現(xiàn)懶加載

    詳解如何在Java中實(shí)現(xiàn)懶加載

    懶加載是一種常見(jiàn)的優(yōu)化技術(shù),它可以延遲對(duì)象的創(chuàng)建或初始化,直到對(duì)象第一次被使用時(shí)才進(jìn)行。在本文中,我們將介紹如何使用?Java?中的?Supplier?接口和雙重檢查鎖定模式來(lái)實(shí)現(xiàn)懶加載,并保證只初始化一次,希望對(duì)大家有所幫助
    2023-03-03
  • IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟(圖文教程)

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

    這篇文章主要介紹了IDEA導(dǎo)入Eclipse項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Jackson處理Optional時(shí)遇到問(wèn)題的解決與分析

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

    Optional是Java實(shí)現(xiàn)函數(shù)式編程的強(qiáng)勁一步,并且?guī)椭诜妒街袑?shí)現(xiàn),但是Optional的意義顯然不止于此,下面這篇文章主要給大家介紹了關(guān)于Jackson處理Optional時(shí)遇到問(wèn)題的解決與分析的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 最新評(píng)論