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

相关文章
|
20天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
1月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
37 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
1月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
23 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
25天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
52 5
|
2月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
32 1
java基础(11)函数重载以及函数递归求和
|
1月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
27 3
|
1月前
|
存储 Java 数据处理
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
35 1
|
2月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
22 3
|
2月前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
2月前
|
SQL Java Linux
Java 8 API添加了一个新的抽象称为流Stream
Java 8 API添加了一个新的抽象称为流Stream

热门文章

最新文章