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比较优雅哈,哈哈哈!!如果对你有用点个赞呗!

相关文章
|
1天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
8 0
|
1天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
6 0
|
1天前
|
Java API
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
|
1天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
3天前
|
存储 安全 算法
掌握Java并发编程:Lock、Condition与并发集合
掌握Java并发编程:Lock、Condition与并发集合
11 0
|
3天前
|
存储 安全 Java
深入理解Java集合框架
深入理解Java集合框架
8 0
|
8天前
|
存储 安全 Java
Java集合的分类有哪些?
Java中的集合就像一个容器,专门用来存储Java对象,这些对象可以是任意的数据类型,并且长度可变。这些集合类都位于java.util包中,在使用时一定要注意导包的问题,否则会出现异常。
34 10
|
2月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
11天前
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
|
1月前
|
Java
Java中拷贝list数组如何实现
Java中拷贝list数组如何实现
11 0