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

Java實(shí)現(xiàn)List集合轉(zhuǎn)樹形結(jié)構(gòu)的示例詳解

 更新時(shí)間:2022年08月18日 09:08:43   作者:Zz要變強(qiáng)  
在開發(fā)中,我們通常需要將從數(shù)據(jù)庫中查詢的集合數(shù)據(jù)轉(zhuǎn)換成類似文件系統(tǒng)一樣的樹形集合。本文將利用Java語言實(shí)現(xiàn)這一功能,感興趣的可以了解一下

在開發(fā)中,我們通常需要將從數(shù)據(jù)庫中查詢的集合數(shù)據(jù)轉(zhuǎn)換成類似文件系統(tǒng)一樣的樹形集合,比如:省市單位,部門機(jī)構(gòu),書籍分類等

TreeNode對(duì)象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNode {
    /**
     * 節(jié)點(diǎn)內(nèi)碼
     */
    private Long id;
    /**
     * 節(jié)點(diǎn)名稱
     */
    private String label;
    /**
     * 父節(jié)點(diǎn)內(nèi)碼
     */
    private Long pid;
    /**
     * 子節(jié)點(diǎn)集合
     */
    private List<TreeNode> children;
}

轉(zhuǎn)換工具類

方式一:foreach遍歷

對(duì)所傳遞的treeList進(jìn)行遍歷,然后判斷該節(jié)點(diǎn)的父id與傳遞的id是否相同,相同則遞歸設(shè)置其孩子節(jié)點(diǎn),并將該節(jié)點(diǎn)的放入children集合中,用于統(tǒng)一返回父節(jié)點(diǎn)相同的所有TreeNode對(duì)象。

方式二:stream流

基于?lter()實(shí)現(xiàn)數(shù)據(jù)過濾

該方法會(huì)接收一個(gè)返回boolean的函數(shù)作為參數(shù),終返回一個(gè)包括所有符合條件元素的流。

基于map()對(duì)元素進(jìn)行轉(zhuǎn)換

它接收一個(gè)函數(shù)作為方法參數(shù),這個(gè)函數(shù)會(huì)被應(yīng)用到集合中每一個(gè) 元素上,并終將其映射為一個(gè)新的元素。

對(duì)集合中的元素進(jìn)行過濾,通過filter將父id相同的所有節(jié)點(diǎn)過濾出來,然后在map中遞歸設(shè)置其孩子節(jié)點(diǎn),并返回。

public class List2TreeList {
 
    //方式一:  使用foreach轉(zhuǎn)換
    public static List<TreeNode> buildTreeUseList(List<TreeNode> treeList,long id){
        //收集傳遞的集合中父id相同的TreeNode
        List<TreeNode> children = new ArrayList<>();
        for (TreeNode treeNode : treeList) {
            //判斷該節(jié)點(diǎn)的父id,是否與傳入的父id相同,相同則遞歸設(shè)置其孩子節(jié)點(diǎn),并將該節(jié)點(diǎn)放入children集合中
            if(treeNode.getPid() == id){
                //遞歸設(shè)置其孩子節(jié)點(diǎn)
                treeNode.setChildren(buildTreeUseList(treeList, treeNode.getId()));
                //放入children集合
                children.add(treeNode);
            }
        }
        return children;
    }
 
    //方式二:  使用stream流轉(zhuǎn)換
    public static List<TreeNode> buildTreeUseStream(List<TreeNode> treeList,long id){
        List<TreeNode> list = treeList.stream()
                //過濾父節(jié)點(diǎn)與傳遞的id相同的TreeNode對(duì)象
                .filter( treeNode -> treeNode.getPid().longValue() == id )
                .map( treeNode -> {
                    //遞歸設(shè)置孩子節(jié)點(diǎn)
                    treeNode.setChildren(buildTreeUseStream(treeList,treeNode.getId()));
                    return treeNode;
                })
                .collect(Collectors.toList());
        return list;
    }
}

功能測試

傳入集合數(shù)據(jù)及最高節(jié)點(diǎn)的父id進(jìn)行轉(zhuǎn)換

@RestController
public class TestController {
 
    @GetMapping("/treeList")
    public List<TreeNode> convert2Tree(){
        List<TreeNode> list = new ArrayList<>();
        list.add(new TreeNode(370000l,"山東省",0l,null));
        list.add(new TreeNode(370100l,"濟(jì)南市",370000l,null));
        list.add(new TreeNode(370200l,"青島市",370000l,null));
        list.add(new TreeNode(370300l,"淄博市",370000l,null));
        list.add(new TreeNode(371300l,"臨沂市",370000l,null));
        list.add(new TreeNode(370102l,"歷下區(qū)",370100l,null));
        list.add(new TreeNode(370103l,"市中區(qū)",370100l,null));
        list.add(new TreeNode(370202l,"市南區(qū)",370200l,null));
        //使用list轉(zhuǎn)換
        List<TreeNode> treeList = List2TreeList.buildTreeUseList(list, 0l);
        System.out.println(treeList);
        return treeList;
    }
}

TreeList結(jié)果格式

轉(zhuǎn)換后的集合數(shù)據(jù)格式

[
    {
        "id": 370000,
        "label": "山東省",
        "pid": 0,
        "children": [
            {
                "id": 370100,
                "label": "濟(jì)南市",
                "pid": 370000,
                "children": [
                    {
                        "id": 370102,
                        "label": "歷下區(qū)",
                        "pid": 370100,
                        "children": []
                    },
                    {
                        "id": 370103,
                        "label": "市中區(qū)",
                        "pid": 370100,
                        "children": []
                    }
                ]
            },
            {
                "id": 370200,
                "label": "青島市",
                "pid": 370000,
                "children": [
                    {
                        "id": 370202,
                        "label": "市南區(qū)",
                        "pid": 370200,
                        "children": []
                    }
                ]
            },
            {
                "id": 370300,
                "label": "淄博市",
                "pid": 370000,
                "children": []
            },
            {
                "id": 371300,
                "label": "臨沂市",
                "pid": 370000,
                "children": []
            }
        ]
    }
]

到此這篇關(guān)于Java實(shí)現(xiàn)List集合轉(zhuǎn)樹形結(jié)構(gòu)的示例詳解的文章就介紹到這了,更多相關(guān)Java List轉(zhuǎn)樹形結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

章丘市| 金坛市| 嵩明县| 察雅县| 德州市| 鹤庆县| 涿州市| 磴口县| 浮山县| 马公市| 富锦市| 河东区| 昌黎县| 江达县| 新密市| 余江县| 阳原县| 深圳市| 阳高县| 重庆市| 成都市| 乡宁县| 平南县| 永吉县| 会同县| 司法| 宁津县| 丰宁| 九江市| 威信县| 当涂县| 南投县| 福鼎市| 阿勒泰市| 苍梧县| 宜兴市| 绿春县| 湖州市| 广平县| 慈溪市| 灌阳县|