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

发布时间:2023年12月21日

你知道的越多,你不知道的越多
点赞再看,养成习惯
如果您有疑问或者见解,欢迎指教:
企鹅:869192208

前言

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

代码实现
定义测试实体类
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;
}
实现方法
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));
    }

打印结果:

[
    {
        "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": ""
    }
]

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

文章来源:https://blog.csdn.net/CDWLX/article/details/135137104
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。