最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教你如何使用Java8實(shí)現(xiàn)菜單樹(shù)形數(shù)據(jù)

 更新時(shí)間:2021年06月16日 11:09:17   作者:lovoo  
今天給大家?guī)?lái)的是關(guān)于JAVA的相關(guān)知識(shí),文中圍繞著如何使用Java8實(shí)現(xiàn)菜單樹(shù)形數(shù)據(jù)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

Java8實(shí)現(xiàn)菜單樹(shù)形數(shù)據(jù)

當(dāng)我們打開(kāi)京東商城時(shí),左側(cè)的菜單依次分為三級(jí)展示,這是如何實(shí)現(xiàn)的呢?

在這里插入圖片描述

本篇暫不講述前端,只講述如何使用java8 的lamada表達(dá)式實(shí)現(xiàn)樹(shù)形數(shù)據(jù)的拼裝

1.創(chuàng)建菜單表

CREATE TABLE `pms_category`  (
  `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分類(lèi)id',
  `name` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分類(lèi)名稱(chēng)',
  `parent_cid` bigint(20) NULL DEFAULT NULL COMMENT '父分類(lèi)id',
  `cat_level` int(11) NULL DEFAULT NULL COMMENT '層級(jí)',
  `show_status` tinyint(4) NULL DEFAULT NULL COMMENT '是否顯示[0-不顯示,1顯示]',
  `sort` int(11) NULL DEFAULT NULL COMMENT '排序',
  `icon` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '圖標(biāo)地址',
  `product_unit` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '計(jì)量單位',
  `product_count` int(11) NULL DEFAULT NULL COMMENT '商品數(shù)量',
  PRIMARY KEY (`cat_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1433 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品三級(jí)分類(lèi)' ROW_FORMAT = Dynamic;

2.創(chuàng)建實(shí)體類(lèi)

其中children用來(lái)存放子類(lèi)

@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 分類(lèi)id
	 */
	@TableId
	private Long catId;
	/**
	 * 分類(lèi)名稱(chēng)
	 */
	private String name;
	/**
	 * 父分類(lèi)id
	 */
	private Long parentCid;
	/**
	 * 層級(jí)
	 */
	private Integer catLevel;
	/**
	 * 是否顯示[0-不顯示,1顯示]
	 */
	private Integer showStatus;
	/**
	 * 排序
	 */
	private Integer sort;
	/**
	 * 圖標(biāo)地址
	 */
	private String icon;
	/**
	 * 計(jì)量單位
	 */
	private String productUnit;
	/**
	 * 商品數(shù)量
	 */
	private Integer productCount;

	/**
	 * 子分類(lèi)
	 */
	@TableField(exist = false)
	private List<CategoryEntity> children;

}

3.實(shí)現(xiàn)一級(jí)分類(lèi)

3.1)首先要查詢(xún)出所有的分類(lèi)信息entities
3.2)然后對(duì)entities過(guò)濾查找一級(jí)分類(lèi),其中一級(jí)分的parentId == 0
3.3)設(shè)置當(dāng)前一級(jí)分類(lèi)的子分類(lèi)
3.4)對(duì)一級(jí)分類(lèi)進(jìn)行排序

代碼如下:

public List<CategoryEntity> listWithTree() {
        //1.查詢(xún)所有分類(lèi)
        List<CategoryEntity> entities = baseMapper.selectList(null);
        //2.組裝
        //2.1) 所到所有的一級(jí)類(lèi)別 ,parentId = 0
        List<CategoryEntity> levelOneMenus = entities.stream()
                .filter(item ->  item.getParentCid() == 0)
                .map(item -> {
                    item.setChildren(this.getChildrens(item, entities));
                    return item;
                })
                .sorted((item1, item2) -> {
                    return (item1.getSort() == null ? 0 : item1.getSort())  - (item2.getSort() == null ? 0 : item2.getSort());
                })
                .collect(Collectors.toList());
        return levelOneMenus;
    }

4.使用遞歸對(duì)子分類(lèi)再進(jìn)行樹(shù)形組裝

4.1)首先判斷當(dāng)前的id是否有等于集合中的元素的parentId
4.2)再對(duì)當(dāng)前子分類(lèi)使用遞歸設(shè)置子分類(lèi)
4.3)對(duì)當(dāng)前子分類(lèi)排序
4.4)返回子分類(lèi)集合

詳細(xì)代碼實(shí)現(xiàn)如下:

private List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all){
        List<CategoryEntity> treeMenus = all.stream()
                //如果菜單中的父菜單Id == 當(dāng)前菜單的id,則說(shuō)明是子菜單
                .filter(item ->  Objects.equals(item.getParentCid(), root.getCatId()))
                .map(item -> {
                    //遞歸添加子菜單
                    List<CategoryEntity> childrens = getChildrens(item, all);
                    item.setChildren(childrens);
                    return item;
                })
                //排序
                .sorted((item1, item2) -> {
                    return (item1.getSort() == null ? 0 : item1.getSort())  - (item2.getSort() == null ? 0 : item2.getSort());
                })
                .collect(Collectors.toList());
        return treeMenus;
    }

到此這篇關(guān)于教你如何使用Java8實(shí)現(xiàn)菜單樹(shù)形數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Java8實(shí)現(xiàn)菜單樹(shù)形數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中關(guān)于移位運(yùn)算符的demo與總結(jié)(推薦)

    java中關(guān)于移位運(yùn)算符的demo與總結(jié)(推薦)

    下面小編就為大家?guī)?lái)一篇java中關(guān)于移位運(yùn)算符的demo與總結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • 解決idea services窗口不見(jiàn)的一種特殊情況(小白采坑系列)

    解決idea services窗口不見(jiàn)的一種特殊情況(小白采坑系列)

    這篇文章主要介紹了解決idea services窗口不見(jiàn)的一種特殊情況(小白采坑系列),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java中joda日期格式化工具的使用示例

    Java中joda日期格式化工具的使用示例

    這篇文章主要介紹了Java中joda日期格式化工具的使用示例,幫助大家更好的利用Java處理時(shí)間,感興趣的朋友可以了解下
    2021-01-01
  • 使用Arthas定位問(wèn)題及分析

    使用Arthas定位問(wèn)題及分析

    本文通過(guò)使用Arthas工具對(duì)一個(gè)bug進(jìn)行分析,發(fā)現(xiàn)該bug的原因是不同類(lèi)型的動(dòng)態(tài)代理(JDK和CGlib)實(shí)現(xiàn)機(jī)制的不同導(dǎo)致的
    2025-01-01
  • 基于SpringBoot2.0默認(rèn)使用Redis連接池的配置操作

    基于SpringBoot2.0默認(rèn)使用Redis連接池的配置操作

    這篇文章主要介紹了基于SpringBoot2.0默認(rèn)使用Redis連接池的配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • mybatis-plus批處理IService的實(shí)現(xiàn)示例

    mybatis-plus批處理IService的實(shí)現(xiàn)示例

    這篇文章主要介紹了mybatis-plus批處理IService的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • JavaAPI中BigInteger、BigDecimal的使用方法及應(yīng)用

    JavaAPI中BigInteger、BigDecimal的使用方法及應(yīng)用

    這篇文章主要給大家介紹了關(guān)于JavaAPI中BigInteger、BigDecimal的使用方法及應(yīng)用,BigInteger是Java中用于表示任意大小整數(shù)的類(lèi),它提供了加、減、乘、除等多種運(yùn)算方法,適用于大整數(shù)處理和高精度計(jì)算場(chǎng)景,需要的朋友可以參考下
    2024-11-11
  • 你必須得會(huì)的SpringBoot全局統(tǒng)一處理異常詳解

    你必須得會(huì)的SpringBoot全局統(tǒng)一處理異常詳解

    程序在運(yùn)行的過(guò)程中,不可避免會(huì)產(chǎn)生各種各樣的錯(cuò)誤,這個(gè)時(shí)候就需要進(jìn)行異常處理,本文主要為大家介紹了SpringBoot實(shí)現(xiàn)全局統(tǒng)一處理異常的方法,需要的可以參考一下
    2023-06-06
  • springboot打jar包之后下載文件的路徑問(wèn)題

    springboot打jar包之后下載文件的路徑問(wèn)題

    這篇文章主要介紹了springboot打jar包之后下載文件的路徑問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java實(shí)現(xiàn)單機(jī)版五子棋

    java實(shí)現(xiàn)單機(jī)版五子棋

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單機(jī)版五子棋源碼,以及五子棋游戲需要的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評(píng)論

新昌县| 南康市| 武川县| 如皋市| 隆昌县| 凤翔县| 柳州市| 仲巴县| 封开县| 石家庄市| 丽水市| 广宗县| 和平县| 遂平县| 宜兴市| 花垣县| 淄博市| 三明市| 祁连县| 启东市| 剑河县| 万山特区| 西乌珠穆沁旗| 司法| 博乐市| 河源市| 独山县| 屏东市| 康定县| 永善县| 四子王旗| 济源市| 郸城县| 观塘区| 永泰县| 阿坝县| 辉南县| 东丰县| 二连浩特市| 梅州市| 澎湖县|