使用 stream 流构建树(不使用递归)

你知道的越多,你不知道的越多

点赞再看,养成习惯

如果您有疑问或者见解,欢迎指教:

企鹅:869192208

文章目录

前言

最近遇到一个地区数据需要转换成树的需求,研究了一种新方法,不使用传统递归的方式,而是使用 stream 流的方式构建树。

代码实现
定义测试实体类
java 复制代码
import lombok.Data;
import java.util.List;

/**
 * <h2> </h2>
 *
 * @author xymy
 * @date 2023/12/21 17:17
 */
@Data
public class TsModel {
    private String id;
    private String name;
    private String pid;
    private List<TsModel> childs;
}
实现方法
java 复制代码
public static void main(String[] args) {
        String str = "[\n" +
                "    {\"id\":\"1\",\"name\":\"张三\",\"pid\":\"\"},\n" +
                "    {\"id\":\"2\",\"name\":\"张三2\",\"pid\":\"\"},\n" +
                "    {\"id\":\"3\",\"name\":\"张三3\",\"pid\":\"\"},\n" +
                "    {\"id\":\"4\",\"name\":\"张三4\",\"pid\":\"\"},\n" +
                "    {\"id\":\"33\",\"name\":\"张三33\",\"pid\":\"3\"},\n" +
                "    {\"id\":\"330\",\"name\":\"张三330\",\"pid\":\"3\"},\n" +
                "    {\"id\":\"3301\",\"name\":\"张三330\",\"pid\":\"330\"},\n" +
                "    {\"id\":\"41\",\"name\":\"张三41\",\"pid\":\"4\"}\n" +
                "]";
        List<TsModel> tsModels = JSONArray.parseArray(str, TsModel.class);
        Map<String, List<TsModel>> pModels = tsModels.stream().collect(Collectors.groupingBy(ts -> StringUtils.isBlank(ts.getPid()) ? "" : ts.getPid()));

        List<TsModel> childTs = new ArrayList<>();
        for (TsModel tsModel : tsModels) {
            String id = tsModel.getId();
            List<TsModel> childModel = pModels.get(id);
            if (CollectionUtils.isNotEmpty(childModel)) {
                tsModel.setChilds(childModel);
                childTs.addAll(childModel);
            }
        }
        Set<String> childSeqs = childTs.stream().map(t -> t.getId()).collect(Collectors.toSet());
        List<TsModel> newTree = tsModels.stream().filter(tsm -> !childSeqs.contains(tsm.getId())).collect(Collectors.toList());

        System.out.println(JSON.toJSONString(newTree));
    }

打印结果:

json 复制代码
[
    {
        "id": "1",
        "name": "张三",
        "pid": ""
    },
    {
        "id": "2",
        "name": "张三2",
        "pid": ""
    },
    {
        "childs": [
            {
                "id": "33",
                "name": "张三33",
                "pid": "3"
            },
            {
                "childs": [
                    {
                        "id": "3301",
                        "name": "张三330",
                        "pid": "330"
                    }
                ],
                "id": "330",
                "name": "张三330",
                "pid": "3"
            }
        ],
        "id": "3",
        "name": "张三3",
        "pid": ""
    },
    {
        "childs": [
            {
                "id": "41",
                "name": "张三41",
                "pid": "4"
            }
        ],
        "id": "4",
        "name": "张三4",
        "pid": ""
    }
]

至此,就实现了列表转成树的逻辑。

相关推荐
公子小六11 小时前
基于.NET的Windows窗体编程之WinForms滑块与上下控件
windows·microsoft·c#·.net·winforms
学海浪太大15 小时前
笔记本电脑插入显示器没反应
windows
黄一一91124317 小时前
告别手动敲字,本地截图 OCR,识别完直接复制!开源截图识别工具
windows·ocr·开源软件·贴图
洪流之源19 小时前
Windows 远程 Ubuntu 24.04 桌面
linux·windows·ubuntu
是小李呀19 小时前
Windows 虚拟内存配置完全指南:从原理到实操,彻底解决内存不足与 OOM 问题
windows
毕竟是shy哥21 小时前
windows电脑WSL下本地构建docker镜像
windows·docker·容器
kakakahahahaha1 天前
【Windows】C盘低空间反复复发的排查与扩容边界
c语言·windows·电脑·笔记本电脑·内容运营·软件需求
2301_800074211 天前
map,list简单方法
windows·python·list
技术不好的崎鸣同学1 天前
Windows 红队实战:前言
windows
吴声子夜歌1 天前
Guava——基本工具(二)
windows·python·guava