JAVA8 新特性StreamAPI使用(二)

一、使用StreamAPI,(基于数据模型——客户、订单和商品,实体关系图如下,客户可以有多个订单,是一对多的关系,而产品和订单的关系是多对多的)需求如下:

二、Stream API思维导图

 

三、需求:

   练习 1 — 获取商品属于"励志"类别的订单信息
   练习 2 — 获取商品"小说"类别的价格最贵的。
   练习 3 — 获取类别是"小说"的商品,且价格为8折销售。
   练习 4 — 获取类别是"小说"的商品,且价格>95的商品信息。
   练习 5 — 获取最近的 2 个订单
   练习 6 —  计算 2024 年 1 月的所有订单的总金额
   练习 7 — 获取"小说"的所有商品的聚合数据(即总和、平均值、最个数大值、最小值、个数)
   练习 8 —  获取订单中的ID和订单产品数量的数据
   练习 9 — 生成按客户分组的订单记录的数据映射
   练习 10 - 获取每个订单商品总价

 四、编码

4.1 、原始数据

List<Order> orders = null;List<Product> products = null;List<Customer> customers = null;@Beforepublic void load() {Product p1 = new Product(1, "人性的弱点", "励志", 56.89);Product p2 = new Product(2, "爱丽丝漫游奇境", "科幻", 26.60);Product p3 = new Product(3, "三国演义", "小说", 85.00);Product p4 = new Product(4, "水浒传", "小说", 99.00);Product p5 = new Product(5, "西游记", "小说", 95.00);Product p6 = new Product(6, "红楼梦", "小说", 105.00);//商品集合products = Arrays.asList(p1, p2, p3, p4, p5, p6);Customer c1 = new Customer(1, "刘芳", 1);Customer c2 = new Customer(2, "单满", 2);Customer c3 = new Customer(3, "王莉", 3);Customer c4 = new Customer(4, "程海燕", 1);Customer c5 = new Customer(5, "王城", 2);Customer c6 = new Customer(6, "王和明", 3);//客户集合customers = Arrays.asList(c1, c2, c3, c4, c5, c6);//集合数据List<Product> products1 = Arrays.asList(p1, p2, p3,p4);List<Product> products2 = Arrays.asList(p1, p4, p5);List<Product> products3 = Arrays.asList(p3, p2, p4);List<Product> products4 = Arrays.asList(p1, p5, p6);Order o1 = new Order(10010, "1", LocalDate.of(2024, 1, 3), LocalDate.of(2024, 1, 25), products1, c1);Order o2 = new Order(10011, "1", LocalDate.of(2024, 2, 5), LocalDate.of(2024, 2, 26), products2, c2);Order o3 = new Order(10012, "2", LocalDate.of(2024, 1, 8), LocalDate.of(2024, 1, 30), products3, c3);Order o4 = new Order(10013, "2", LocalDate.of(2024, 3, 1), LocalDate.of(2024, 3, 18), products4, c3);//订单集合orders = Arrays.asList(o1, o2, o3, o4);
//        System.out.println(orders);}

4.2、 操作1-10小题

  //    练习 1 — 获取商品属于"励志"类别的订单信息@Testpublic void test1() {List<Order> list = orders.stream().filter(o -> o.getProducts().stream().anyMatch(p -> p.getKind().equals("励志"))).collect(Collectors.toList());System.out.println(list);}//    练习 2 — 获取商品"小说"类别的价格最贵的。@Testpublic void test2() {Optional<Product> ll = products.stream().filter(p -> p.getKind().equals("小说")).max(Comparator.comparing(Product::getPrice));System.out.println(ll.get());}//    练习 3 — 获取类别是"小说"的商品,且价格为8折销售。@Testpublic void test3() {List<Double> ll = products.stream().filter(p -> p.getKind().equals("小说")).map(p -> p.getPrice() * 0.8).collect(Collectors.toList());System.out.println(ll);}//    练习 4 — 获取类别是"小说"的商品,且价格>95的商品信息。@Testpublic void test4() {products.stream().filter(p -> p.getKind().equals("小说")).filter(p -> p.getPrice() > 95).forEach(System.out::println);}//    练习 5 — 获取最近的 2 个订单@Testpublic void test5() {orders.stream().sorted(Comparator.comparing(Order::getOrderDate).reversed()) //降序.limit(2).forEach(System.out::println);}//    练习 6 —  计算 2024 年 1 月的所有订单的总金额@Testpublic void test6() {double sums=  orders.stream().filter(o->o.getOrderDate().compareTo(LocalDate.of(2024,1,1))>=0).filter(o->o.getOrderDate().compareTo(LocalDate.of(2024,2,1))<=0).flatMap(p->p.getProducts().stream()).mapToDouble(Product::getPrice).sum();System.out.println(sums);}//    练习 7 — 获取类别"小说"的所有商品的统计数据(即总和、平均值、最大值、最小值、个数)@Testpublic void test7() {DoubleSummaryStatistics dss= products.stream().filter(p -> p.getKind().equals("小说")).mapToDouble(Product::getPrice).summaryStatistics();System.out.println(dss);}//    练习 8 —  获取订单中的ID和订单产品数量的数据@Testpublic void test8() {Map<Long,Integer> map= orders.stream().collect(Collectors.toMap(Order::getOid,o->o.getProducts().size()));System.out.println(map);}//    练习 9 — 生成按客户分组的订单记录的数据映射@Testpublic void test9() {Map<Customer,List<Order>> map= orders.stream().collect(Collectors.groupingBy(Order::getCustomer));System.out.println(map);}//    练习 10 - 获取每个订单商品总价@Testpublic void test10() {Map<Order,Double> map= orders.stream().collect(Collectors.toMap(Function.identity(),o->o.getProducts().stream().mapToDouble(Product::getPrice).sum()));System.out.println(map);}

五、总结:

     采用 Java Stream API 是一种思维转变,从传统的命令式编程转变为函数式编程。因此,练习帮助我们思考流数据流中的逻辑很重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299007.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java EE】SpringBoot的创建与简单使用

文章目录 &#x1f340;环境准备&#x1f333;Maven&#x1f332;SpringBoot是什么&#x1f384;Spring Boot 项目创建&#x1f338;使用Idea创建&#x1f338;创建SpringBoot项⽬&#x1f338;SpringBoot项目的运行 ⭕总结 &#x1f340;环境准备 如果你的IDEA是专业版&#…

六、从零实战企业级K8S本地部署ThingsBoard专业版集群

1、从 docker hub 拉取 ThingsBoard PE 映像(所有节点) 1.1、查看k8s信息(主节点) kubectl cluster-info #查看k8s集群信息 kubectl get node #查看节点信息 kubectl get pod -A #查看内部组件1.2、从 docker hub 拉取 ThingsBoard PE 映像(所有…

SYS-2722音频分析仪SYS2722

181/2461/8938产品概述&#xff1a; Audio Precision 2722 音频分析仪是 Audio Precision 屡获殊荣的 PC 控制音频分析仪的旗舰型号&#xff0c;长期以来一直是音频设备设计和测试的全球公认标准。功能齐全的 SYS-2722 提供了测试转换器技术最新进展所需的无与伦比的失真和噪声…

Linux云计算之网络基础9——园区网络架构项目

要求构建大型园区网络架构&#xff0c;方案如下&#xff1a; 园区A 园区c 公司B 要求&#xff1a; 1、A公司园区网络 一台汇聚层三层交换机&#xff0c;两台接入层二层交换机。 出口有一台路由器。 2、A园区有五台服务器。 分别为两台 WEB 服务器&#xff0c;…

专注项目管理的Mac工具 - Project Office Pro 最新版

Project Office Pro for Mac是一款功能强大的项目管理软件&#xff0c;旨在帮助用户更好地管理和跟踪项目进展&#xff0c;提高工作效率和质量。以下是该软件的主要功能介绍&#xff1a; 项目创建与编辑&#xff1a;用户可以根据自己的需求自定义项目计划&#xff0c;包括设置…

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design+百小僧开源框架

C#手术麻醉信息系统源码&#xff0c;技术框架&#xff1a;Vue&#xff0c;Ant-Design百小僧开源框架 手术麻醉系统主要用于在手术过程中监测和控制患者的状态&#xff0c;确保手术的顺利进行并保障患者的生命安全。该系统通过一系列先进的医疗设备和技术&#xff0c;为手术患者…

玩机进阶教程-----高通9008线刷XML脚本修改备份 檫除的操作步骤解析

在高通9008官方固件中我们可以看到刷写需要的脚本rawprogram0.xml和辅助脚本patch0.xml&#xff0c;脚本的作用在于将固件内各个分区对应写入手机内。根据分区地址段。然后判断脚本中那些分区不写入。以下步骤将分析emmc字库为例来讲解如何将默认刷入脚本修改为备份 檫除脚本。…

C++——栈和队列容器

前言&#xff1a;这篇文章我们将栈和队列两个容器放在一起进行分享&#xff0c;因为这两个要分享的知识较少&#xff0c;而且两者在结构上有很多相似之处&#xff0c;比如栈只能在栈顶操作&#xff0c;队列只能在队头和队尾操作。 不同于前边所分享的三种容器&#xff0c;这篇…

搭建电商购物独立站抓取主流电商产品数据的方法:工具+电商数据采集API接口

分享一个抓取数据产品的方法&#xff0c;也是别人给我说的。 想做一个联盟产品相关的网站&#xff0c;然后需要采集电商网站的产品。咨询大佬告诉我&#xff0c;大量级电商商品数据的采集可以接入专业的电商数据采集API接口&#xff0c;也可以用webscrsper&#xff0c;于是乎就…

bootstrap+thymeleaf 页面多选回显时莫名其妙多了

bootstrapthymeleaf 页面多选回显时莫名其妙多了 问题现象问题分析问题处理总结 问题现象 今天遇到的问题的描述正如标题中的一样&#xff0c;就是后台管理系统在配置完内容后点击保存&#xff0c;回显时发现页面竟然莫名其妙多了一些数据。项目整体后台管理系统采用的是boots…

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于CPO-GPR基于冠豪猪算法优化高斯…

【Consul】基于Golang实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制

【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制 大家好 我是寸铁&#x1f44a; 总结了一篇【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制✨ 这应该是目前全网最全的使用golang手…

Git命令(1)[删除,恢复与移动]

文章目录 1.删除文件1.1命令----rm <filename>1.2命令----git rm <filename>1.1命令----git rm <filename> -f 2.恢复文件2.1命令----git restore <filename>2.1命令----git restore --staged <filename> 3.重命名文件3.1命令----mv 旧文件 新文…

Node.js------Express

◆ 能够使用 express.static( ) 快速托管静态资源◆ 能够使用 express 路由精简项目结构◆ 能够使用常见的 express 中间件◆ 能够使用 express 创建API接口◆ 能够在 express 中启用cors跨域资源共享 一.初识Express 1.Express 简介 官方给出的概念&#xff1a;Express 是基…

CSS - 你实现过0.5px的线吗

难度级别:中级及以上 提问概率:75% 我们知道在网页显示或是网页打印中,像素已经是最小单位了,但在很多时候,即便是最小的1像素,精度却不足以呈现所需的线条精度和细节。因此,为了在网页显示和网页打印中呈现更加细致的线条,为了在视觉…

带你了解自动驾驶中的功能安全

谈一谈自动驾驶中的功能安全 附赠自动驾驶学习资料和量产经验&#xff1a;链接 一 概述 汽车涉及到人的生命财产安全&#xff0c;谈汽车首先要谈的就是安全。目前自动驾驶的安全主要分为三大块&#xff1a;功能安全&#xff0c;网络&#xff08;信息&#xff09;安全&#xf…

【LeetCode】--- 动态规划 集训(二)

目录 一、63. 不同路径 II1.1 题目解析1.2 状态转移方程1.3 解题代码 二、931. 下降路径最小和2.1 题目解析2.2 状态转移方程2.3 解题代码三、174. 地下城游戏3.1 题目解析3.2 状态转移方程3.3 解题代码 一、63. 不同路径 II 题目地址&#xff1a; 不同路径 II 一个机器人位于…

腾讯云(CVM)托管进行权限维持

前言 刚好看到一个师傅分享了一个阿里云ECS实战攻防&#xff0c;然后想到了同样利用腾讯云CVM的托管亦可实现在实战攻防中的权限维持。 简介 腾讯云自动化助手&#xff08;TencentCloud Automation Tools&#xff0c;TAT&#xff09;是一个原生运维部署工具&#xff0c;它可…

“Linux 三剑客”,通常指的是三个经典的命令行工具:grep、sed 和 awk

1、grep&#xff1a; 简介&#xff1a;grep 是一个强大的文本搜索工具&#xff0c;可以用于在文件中查找匹配特定模式的行。示例&#xff1a; 搜索包含特定关键词的行&#xff1a; grep "keyword" filename 递归搜索目录下所有文件&#xff1a; grep -r define zj…

java面试题(Redis)

事情干的差不多了&#xff0c;开刷面试题和算法&#xff0c;争取在短时间内快速成长&#xff0c;理解java面试的常见题型 一、redis使用场景&#xff1a; 缓存&#xff1a;穿透、击穿、雪崩 双写一致、持久化 数据过期、淘汰策略 分布式锁&#xff1a;setnx、redisson 计数…