Java8新特性-Stream流

可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理。

我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。

实体类:Menu.java

package com.example.demo.model;import lombok.Builder;
import lombok.Data;import java.util.List;/*** 树结构:Menu*/
@Data
@Builder
public class Menu {/*** id*/public Integer id;/*** 名称*/public String name;/*** 父id ,根节点为0*/public Integer parentId;/*** 子节点信息*/public List<Menu> childList;public Menu(Integer id, String name, Integer parentId) {this.id = id;this.name = name;this.parentId = parentId;}public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {this.id = id;this.name = name;this.parentId = parentId;this.childList = childList;}}

递归组装树形结构:

package com.example.demo;import com.alibaba.fastjson.JSON;
import com.example.demo.model.Menu;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;@SpringBootTest
class DemoApplicationTests {@Testvoid contextLoads() {//模拟从数据库查询出来List<Menu> menus = Arrays.asList(new Menu(1,"商品管理",0),new Menu(2,"会员管理",0),new Menu(3,"系统管理",0),new Menu(4,"系统工具",0),new Menu(5,"用户管理",3),new Menu(6,"角色管理",3),new Menu(7,"菜单栏管理",3),new Menu(8,"日志管理",4),new Menu(9,"商品列表",1),new Menu(10,"订单列表",1),new Menu(11,"会员等级",2),new Menu(12,"品牌列表",1));//获取父节点List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map((m) -> {m.setChildList(getChildrens(m, menus));return m;}).collect(Collectors.toList());System.out.println("-------转json输出结果-------");System.out.println(JSON.toJSON(collect));}/*** 递归查询子节点* @param root  根节点* @param all   所有节点* @return 根节点信息*/private List<Menu> getChildrens(Menu root, List<Menu> all) {List<Menu> children = all.stream().filter(m -> {return Objects.equals(m.getParentId(), root.getId());}).map((m) -> {m.setChildList(getChildrens(m, all));return m;}).collect(Collectors.toList());return children;}}

格式化打印结果:

[{"name": "商品管理","childList": [{"name": "商品列表","childList": [],"id": 9,"parentId": 1}, {"name": "订单列表","childList": [],"id": 10,"parentId": 1}, {"name": "品牌列表","childList": [],"id": 12,"parentId": 1}],"id": 1,"parentId": 0
}, {"name": "会员管理","childList": [{"name": "会员等级","childList": [],"id": 11,"parentId": 2}],"id": 2,"parentId": 0
}, {"name": "系统管理","childList": [{"name": "用户管理","childList": [],"id": 5,"parentId": 3}, {"name": "角色管理","childList": [],"id": 6,"parentId": 3}, {"name": "菜单栏管理","childList": [],"id": 7,"parentId": 3}],"id": 3,"parentId": 0
}, {"name": "系统工具","childList": [{"name": "日志管理","childList": [],"id": 8,"parentId": 4}],"id": 4,"parentId": 0
}]

总结

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

Java8新特性-使用Stream流来实现递归遍历树形结构(案例)相关推荐

  1. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>

    需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...

  2. java stream byte_乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  3. Java8新特性之Stream流式编程

    特地感谢鲁班大叔的分享,原学习地址:Java8 Stream流式编程爱 撸码就是快,流式编程好 代码传家宝 以下是学习过程整理的笔记 1.简介 Stream 流处理,首先要澄清的是 java8 中的 ...

  4. java8新特性之Stream流

    一.什么是Stream流 Stream是java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤.映射数据等操作,使用Stream API对集合数据进行操作就 ...

  5. Java8新特性之Stream流的使用

    Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作,在新版的JPA中,也已经加入了Stream. 1.Stream的操作步骤 Stream有如下三个操 ...

  6. JAVA8新特性之Stream流分组

    Apple apple01 = new Apple(1, "red", 100, "成都");Apple apple02 = new Apple(2, &quo ...

  7. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  8. 跟我学 Java 8 新特性之 Stream 流基础体验

    转载自   跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...

  9. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

最新文章

  1. 《虚拟化与云计算》第4章 虚拟化的业界动态
  2. SCCM 2012系列4 配置SCCM2012 Endpoint Protection上
  3. python中列表用某个数字出现的次数_Python实现统计给定列表中指定数字出现次数的方法...
  4. 日常生活小技巧 -- Notepad++一次删除带指定关键字的行
  5. 《Java 核心技术卷1 第10版》学习笔记------ Object类的 hashCode 方法
  6. 前端请求进化之路--从form表单到JSONP
  7. php 解析yaml,php yaml 解析 报错问题
  8. free,ps,抓包,网络状态
  9. 基于深度学习的大豆叶片病害识别(自然环境下1470张图像)
  10. linux下imp导入oracle数据库,Oracle数据库Linux下的导入IMP
  11. python下载手机版-python
  12. 深入剖析Java类加载机制
  13. DBCC CHECKDB 数据库或表修复
  14. 见过这么有才的笑话吗?
  15. <Zhuuu_ZZ>让我们来康康脚本流程控制
  16. 作物病虫害识别数据集资源合集
  17. Python数据科学家学习计划分几步?
  18. 抓包工具有哪些你知道吗?今天给你们介绍四款最受欢迎的抓包神器
  19. android软件开发之webView.addJavascriptInterface循环渐进【二】
  20. 服务器文件上传500报错,500 InternalServerError

热门文章

  1. 一文搞懂lib中physical cell
  2. 程序员从普通二本毕业的真实薪资,记录一路走来的路
  3. CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig
  4. JavaSE-Adventure(III): Generics 泛型程序设计
  5. msgbox.html5.qq .com,霸道总裁之代码强势表白
  6. PFC颗粒分析第一步:掌握离散元这些成样方法就够了!
  7. ubuntu 18共享文件夹不显示问题解决
  8. python readline读文件,并且将其转化为数字形式时:ValueError: could not convert string to float:
  9. Windows10,21H1 官方正式ESD版下载地址
  10. OGC PUCK协议标准版本v1.4 翻译