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

Java利用TreeUtils工具類實(shí)現(xiàn)列表轉(zhuǎn)樹

 更新時間:2022年11月22日 11:34:57   作者:賽先生和泰先生  
在開發(fā)過程中,總有列表轉(zhuǎn)樹的需求,幾乎是項(xiàng)目的標(biāo)配,有沒有一種通用且跨項(xiàng)目的解決方式呢?本文將基于Java8的Lambda?表達(dá)式和Stream等知識,使用TreeUtils工具類實(shí)現(xiàn)一行代碼完成列表轉(zhuǎn)樹這一通用型需求,需要的可以參考一下

一、序言

在日常一線開發(fā)過程中,總有列表轉(zhuǎn)樹的需求,幾乎是項(xiàng)目的標(biāo)配,比方說做多級菜單、多級目錄、多級分類等,有沒有一種通用且跨項(xiàng)目的解決方式呢?幫助廣大技術(shù)朋友給業(yè)務(wù)瘦身,提高開發(fā)效率。

本文將基于Java8的Lambda 表達(dá)式和Stream等知識,使用TreeUtils工具類實(shí)現(xiàn)一行代碼完成列表轉(zhuǎn)樹這一通用型需求。本文有配套視頻,傳送門直達(dá)。

需要說明的是,本TreeUtils工具類已進(jìn)行三版優(yōu)化,能夠勝任生產(chǎn)場景絕大多數(shù)列表轉(zhuǎn)樹的。

二、實(shí)戰(zhàn)編碼

1、引入坐標(biāo)

本坐標(biāo)地址包含TreeUtils工具類方法,已經(jīng)發(fā)布到Maven中央倉庫,建議使用最新的版本號,本文發(fā)布時版本是1.5.8.3,若有最新版本,建議使用最新版本。

學(xué)習(xí)源碼的朋友,源碼直通車

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-common</artifactId>
    <version>1.5.8.3</version>
</dependency>

2、編寫DO

DO是訪問數(shù)據(jù)庫實(shí)體類,屬于前期準(zhǔn)備素材。

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "bu_category3")
public class Category {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO)
    private String id;
    private String name;
    private String parentId;
    private String remark;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    
    public Category(Category category) {
        if (Objects.nonNull(category)) {
            this.id = category.id;
            this.name = category.name;
            this.parentId = category.parentId;
            this.remark = category.remark;
            this.createTime = category.createTime;
            this.updateTime = category.updateTime;
        }
    }
}

3、創(chuàng)建BO

創(chuàng)建BO數(shù)據(jù)模型用于構(gòu)造屬性結(jié)點(diǎn)

@Data
@NoArgsConstructor
public class CategoryBo {
    private String id;
    private String name;
    private String parentId;
    private String remark;
    /**
     * 孩子結(jié)點(diǎn) 名字任意取
     */
    private List<CategoryBo> childList;
    /**
     * 實(shí)現(xiàn)Category 轉(zhuǎn) CategoryBo
     *
     * @param category
     */
    public CategoryBo(Category category) {
        if (Objects.nonNull(category)) {
            this.id = category.getId();
            this.name = category.getName();
            this.parentId = category.getParentId();
            this.remark = category.getRemark();
        }
    }
}

3、調(diào)用TreeUtils工具類

在服務(wù)層調(diào)用TreeUtils工具類,一行代碼完成轉(zhuǎn)換。

/**
 * 獲取DO中指定的屬性 并構(gòu)造成樹
 * @return
 */
public List<CategoryBo> selectCategory4() {
    List<Category> categoryList = this.list();
    List<CategoryBo> categoryBoList = EntityUtils.toList(categoryList, CategoryBo::new);
    return TreeUtils.createNodeDetail(categoryBoList, "000000", CategoryBo::getId, CategoryBo::getParentId, CategoryBo::getChildList);
}

4、效果展示

原始列表數(shù)據(jù)

{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {
      "id": "310000",
      "name": "電子商務(wù)",
      "parentId": "000000",
      "remark": "EEEEE",
      "createTime": null,
      "updateTime": "2021-11-21 11:22:40"
    },
    {
      "id": "310100",
      "name": "大宗商品",
      "parentId": "310000",
      "remark": "JJJJJ",
      "createTime": null,
      "updateTime": "2021-11-21 11:22:52"
    },
    {
      "id": "310101",
      "name": "大宗商品綜合",
      "parentId": "310100",
      "remark": "IIIII",
      "createTime": null,
      "updateTime": "2021-11-21 11:22:58"
    },
    {
      "id": "310102",
      "name": "鋼鐵類電商",
      "parentId": "310100",
      "remark": "OOOOO",
      "createTime": null,
      "updateTime": "2021-11-21 11:23:02"
    },
    {
      "id": "310200",
      "name": "綜合電商",
      "parentId": "310000",
      "remark": "NNNNN",
      "createTime": null,
      "updateTime": "2021-11-21 11:23:07"
    }
  ]
}

樹狀層次數(shù)據(jù)

{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {
      "id": "310000",
      "name": "電子商務(wù)",
      "parentId": "000000",
      "remark": "EEEEE",
      "childList": [
        {
          "id": "310100",
          "name": "大宗商品",
          "parentId": "310000",
          "remark": "JJJJJ",
          "childList": [
            {
              "id": "310101",
              "name": "大宗商品綜合",
              "parentId": "310100",
              "remark": "IIIII",
              "childList": []
            },
            {
              "id": "310102",
              "name": "鋼鐵類電商",
              "parentId": "310100",
              "remark": "OOOOO",
              "childList": []
            }
          ]
        },
        {
          "id": "310200",
          "name": "綜合電商",
          "parentId": "310000",
          "remark": "NNNNN",
          "childList": []
        }
      ]
    }
  ]
}

三、小結(jié)

通過一個小小的高頻業(yè)務(wù)場景,抽離業(yè)務(wù)共性,屏蔽業(yè)務(wù)細(xì)節(jié),實(shí)現(xiàn)了通用型業(yè)務(wù)邏輯的編碼。

希望廣大技術(shù)朋友在完成日常開發(fā)工作的前提下,能夠進(jìn)一步打磨代碼,感受編程之美。

到此這篇關(guān)于Java利用TreeUtils工具類實(shí)現(xiàn)列表轉(zhuǎn)樹的文章就介紹到這了,更多相關(guān)Java TreeUtils列表轉(zhuǎn)樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis分頁查詢與特殊字符處理方式

    MyBatis分頁查詢與特殊字符處理方式

    這篇文章主要介紹了MyBatis分頁查詢與特殊字符處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 6個必備的Java并發(fā)面試種子題目合集

    6個必備的Java并發(fā)面試種子題目合集

    并發(fā)是Java面試的經(jīng)常會考到的知識點(diǎn),這篇文章主要為大家整理了6個必備的Java并發(fā)面試種子題目,文中的示例代碼簡潔易懂,需要的可以學(xué)習(xí)一下
    2023-07-07
  • Spring實(shí)戰(zhàn)之注入集合值操作示例

    Spring實(shí)戰(zhàn)之注入集合值操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之注入集合值操作,結(jié)合實(shí)例形式分析了Spring注入集合值相關(guān)配置及使用操作技巧,需要的朋友可以參考下
    2019-11-11
  • Mybatis-Plus打印sql日志兩種方式

    Mybatis-Plus打印sql日志兩種方式

    這篇文章主要給大家介紹了關(guān)于Mybatis-Plus打印sql日志兩種方式,Mybatis-plus是MyBatis增強(qiáng)工具包,用于簡化CRUD操作,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java中用戶線程與守護(hù)線程的使用區(qū)別

    Java中用戶線程與守護(hù)線程的使用區(qū)別

    這篇文章主要介紹了Java中用戶線程與守護(hù)線程的使用區(qū)別,Java語言中無論是線程還是線程池,默認(rèn)都是用戶線程,因此用戶線程也被成為普通線程,下文關(guān)于其與守護(hù)線程的區(qū)別詳情,需要的小伙伴可以參考一下
    2022-05-05
  • java web實(shí)現(xiàn)自動登錄

    java web實(shí)現(xiàn)自動登錄

    這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)自動登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Struts2學(xué)習(xí)筆記(2)-路徑問題解決

    Struts2學(xué)習(xí)筆記(2)-路徑問題解決

    本文主要介紹Struts2的路徑問題,盡量不要使用相對路徑,使用相對路徑會讓路徑問題變得很繁瑣很麻煩,推薦使用絕對路徑,希望能給大家做一個參考。
    2016-06-06
  • Spring-boot 中@Async使用遇到的坑

    Spring-boot 中@Async使用遇到的坑

    這篇文章主要介紹了Spring-boot 中@Async使用的坑,首先使用@Async 需要在Spring啟動類上添加注解@EnableAsyn或者在你們線程池配置類添加@EnableAsyn,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于集合和字符串的互轉(zhuǎn)實(shí)現(xiàn)方法

    關(guān)于集合和字符串的互轉(zhuǎn)實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄P(guān)于集合和字符串的互轉(zhuǎn)實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java groovy內(nèi)存回收測試步驟解析

    Java groovy內(nèi)存回收測試步驟解析

    這篇文章主要介紹了Java groovy內(nèi)存回收測試步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05

最新評論

林芝县| 双流县| 文成县| 渭源县| 准格尔旗| 织金县| 南靖县| 梅州市| 泰顺县| 漳平市| 崇阳县| 平南县| 峨山| 岳阳市| 河北区| 彩票| 胶南市| 开封市| 彭水| 池州市| 原阳县| 枞阳县| 鄢陵县| 淳安县| 东莞市| 临城县| 聂拉木县| 陵水| 万盛区| 潮安县| 濉溪县| 九江县| 南城县| 花莲县| 黑龙江省| 神木县| 德令哈市| 五台县| 织金县| 阿拉善左旗| 鲁山县|