使用 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": ""
    }
]

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

相关推荐
梓仁沐白6 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
九鼎科技-Leo10 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Yang.9912 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
我不瘦但很逗13 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows
ashane131414 小时前
Java list
java·windows·list
万里沧海寄云帆14 小时前
Word 插入分节符页码更新问题
windows·microsoft·word
dot.Net安全矩阵15 小时前
.NET 通过模块和驱动收集本地EDR的工具
windows·安全·web安全·.net·交互
编程修仙17 小时前
Collections工具类
linux·windows·python
程序员小羊!18 小时前
高级 SQL 技巧讲解
windows
xiangshangdemayi20 小时前
Windows环境GeoServer打包Docker极速入门
windows·docker·容器·geoserver·打包·数据挂载