Java使用stream来把list集合转化为树形结构(一行解决超简单递归)

简介: Java使用stream来把list集合转化为树形结构(一行解决超简单递归)

Java使用stream来把list集合转化为树形结构(一行解决超简单递归)


一、前言

我们在日常开发中,必不可少的就是树形结构。有的时候可以使用mybatis的resultMap进行转化,有的时候需要进行Java进行手动转化为树结构。今天和大家分析一个JDK8新特性Stream来实现list到树形结构的转化!

二、创建返回前端的实体类VO

import lombok.Data;
import java.util.List;
/**
 * @author wangzhenjun
 * @date 2022/2/28 10:28
 */
@Data
public class NodeVO {
    private String id;
    private String name;
    private String pid;
    private List<NodeVO> children;
    public NodeVO(String id, String name, String pid) {
        this.id = id;
        this.name = name;
        this.pid = pid;
    }
}

三、list转树形方法

public static List<NodeVO> streamToTree(List<NodeVO> treeList, String parentId) {
    List<NodeVO> list = treeList.stream()
            // 过滤父节点
            .filter(parent -> parent.getPid().equals(parentId))
            // 把父节点children递归赋值成为子节点
            .map(child -> {
                child.setChildren(streamToTree(treeList,child.getId()));
                return child;
            }).collect(Collectors.toList());
    return list;
}

四、测试

public static void main(String[] args) {
  NodeVO NodeVO1 = new NodeVO("1","山东省","0");
  NodeVO NodeVO2 = new NodeVO("2","青岛市","1");
  NodeVO NodeVO3 = new NodeVO("3","市北区","2");
  NodeVO NodeVO4 = new NodeVO("4","济南市","1");
  NodeVO NodeVO5 = new NodeVO("5","浙江省","0");
  NodeVO NodeVO6 = new NodeVO("6","杭州市","5");
  NodeVO NodeVO7 = new NodeVO("7","西湖区","6");
  List<NodeVO> list = new ArrayList<>();
  list.add(NodeVO1);
  list.add(NodeVO2);
  list.add(NodeVO3);
  list.add(NodeVO4);
  list.add(NodeVO5);
  list.add(NodeVO6);
  list.add(NodeVO7);
  // 默认父节点id为0
  List<NodeVO> nodeVOList = streamToTree(list,"0");
  System.out.println(JSON.toJSONString(nodeVOList));
}

结果展示:

[
  {
    "children": [
      {
        "children": [
          {
            "children": [],
            "id": "3",
            "name": "市北区",
            "pid": "2"
          }
        ],
        "id": "2",
        "name": "青岛市",
        "pid": "1"
      },
      {
        "children": [],
        "id": "4",
        "name": "济南市",
        "pid": "1"
      }
    ],
    "id": "1",
    "name": "山东省",
    "pid": "0"
  },
  {
    "children": [
      {
        "children": [
          {
            "children": [],
            "id": "7",
            "name": "西湖区",
            "pid": "6"
          }
        ],
        "id": "6",
        "name": "杭州市",
        "pid": "5"
      }
    ],
    "id": "5",
    "name": "浙江省",
    "pid": "0"
  }
]

五、总结

也可以使用两个for来实现,小编还是觉得Stream比较优雅哈,哈哈哈!!如果对你有用点个赞呗!

相关文章
|
4月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
234 1
|
5月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
5月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
329 100
|
5月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
350 101
|
5月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
305 101
|
5月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
124 0
Java Stream API 的强大功能
|
6月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。
|
6月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
414 188
|
6月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
321 92
|
7月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
433 80