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.hqwc.cn/news/595570.html

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

相关文章

用C/C++加Easyx实现俄罗斯方块游戏(爆肝4万字,完全免费)

前言 相信大家一定玩过俄罗斯方块这款小游戏&#xff0c;简单容易上手是老少皆宜的小游戏&#xff0c;今天大家就跟着我来实现这个小游戏吧&#xff01;让自己学的C语言有用武之地。 为了让俄罗斯方块的开发更为简单些&#xff0c;图像更为丰富&#xff0c;在这里就利用了Easyx…

故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab) 模型描述 偏最小二乘法(Partial Least Squares, PLS)是一种统计建模方法,用于建立变量之间的线性关系模型。它是对多元线性回归方法的扩展,特别适用于处理高维数据和具有多重共线性的数据集。…

Java面向对象进阶基础知识

面向对象进阶 static 静态变量 被该类的所有的对象共享 不属于对象,属于类 随着类的加载而加载,优先于对象存在 类名调用(推荐) 对象名调用 static的注意事项 静态方法中没有this关键字 静态方法,只能访问静态 非静态方法可以访问所有 在Java中&#xff0c;static关…

在CentOS 7上安装Python 3.7.7

文章目录 一、实战步骤1. 安装编译工具2. 下载Python 3.7.7安装包3. 上传Python 3.7.7安装包4. 解压缩安装包5. 切换目录并编译安装6. 配置Python环境变量7. 使配置生效8. 验证安装是否成功 二、实战总结 一、实战步骤 1. 安装编译工具 在终端中执行以下命令 yum -y groupin…

【Python系列】将生成的 JSON 数据写入 JSON 文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

算法---分治(归并排序)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于归并排序的专题 对于归并排序在我个人主页专栏 <排序> 有详细的介绍 如果有不足的或者错误的请您指出! 1.归并排序 题目: 排序数组 1.1解析 关于归并排序…

利用Flutter混淆工具提高应用的反编译难度

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

2024妈妈杯数学建模思路ABCD题思路汇总分析 MathorCup建模思路分享

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

数据库的简单查询

一、检索一列或多列1.检索单独一列 select 列名 from 表名; select order_num from orders; 2.检索多列数据 select 列 1&#xff0c;列 2... from 表名; select order_num,order_date from orders; select order_date,order_num from orders; 3.查询所有字段 select * from…

电工技术学习笔记——正弦交流电路

一、正弦交流电路 1. 正弦量的向量表示法 向量表示方法&#xff1a;正弦交流电路中&#xff0c;相量表示法是一种常用的方法&#xff0c;用于描述电压、电流及其相位关系。相量表示法将正弦交流信号表示为复数&#xff0c;通过复数的运算来描述电路中各种参数的相互关系 …

阿里云服务器2核2G优惠价格99元和61元一年配置对比

阿里云2核2G云服务器租用价格61元一年和99元1年&#xff1a;轻量应用服务器2核2G3M、50GB 高效云盘、3M带宽&#xff0c;不限制流量&#xff0c;优惠价格61元一年&#xff1b;云服务器ECS经济型e实例、2核2G&#xff0c;3M固定带宽&#xff0c;40G ESSD Entry云盘&#xff0c;租…

ChatGPT(3.5版本)开放无需注册:算力背后的数据之战悄然打响

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…