JAVA8 新特性StreamAPI使用(二)

news2025/1/18 11:54:49

一、使用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;

    @Before
    public 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 — 获取商品属于"励志"类别的订单信息
    @Test
    public 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 — 获取商品"小说"类别的价格最贵的。
    @Test
    public void test2() {
        Optional<Product> ll = products.stream()
                .filter(p -> p.getKind().equals("小说"))
                .max(Comparator.comparing(Product::getPrice));
        System.out.println(ll.get());
    }

    //    练习 3 — 获取类别是"小说"的商品,且价格为8折销售。
    @Test
    public 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的商品信息。
    @Test
    public void test4() {
        products.stream()
                .filter(p -> p.getKind().equals("小说"))
                .filter(p -> p.getPrice() > 95)
                .forEach(System.out::println);
    }


    //    练习 5 — 获取最近的 2 个订单
    @Test
    public void test5() {
           orders.stream()
                .sorted(Comparator.comparing(Order::getOrderDate).reversed()) //降序
                .limit(2)
                .forEach(System.out::println);
    }


    //    练习 6 —  计算 2024 年 1 月的所有订单的总金额
    @Test
    public 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 — 获取类别"小说"的所有商品的统计数据(即总和、平均值、最大值、最小值、个数)

    @Test
    public void test7() {
      DoubleSummaryStatistics dss= products.stream()
                .filter(p -> p.getKind().equals("小说"))
                .mapToDouble(Product::getPrice)
                .summaryStatistics();
        System.out.println(dss);
    }

    //    练习 8 —  获取订单中的ID和订单产品数量的数据

    @Test
    public void test8() {
         Map<Long,Integer> map= orders.stream()
                   .collect(Collectors.toMap(Order::getOid,o->o.getProducts().size()));

        System.out.println(map);
    }


    //    练习 9 — 生成按客户分组的订单记录的数据映射

    @Test
    public void test9() {
      Map<Customer,List<Order>> map= orders.stream()
                .collect(Collectors.groupingBy(Order::getCustomer));
        System.out.println(map);
    }

//    练习 10 - 获取每个订单商品总价
    @Test
    public 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.coloradmin.cn/o/1572214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024.4.1-[作业记录]-day06-认识 CSS(三大特性、引入方式)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; day06-认识 CSS(三大特性、引入方式) 文章目录 day06-认识 CSS(三大特性、引入方式)作业…

上位机图像处理和嵌入式模块部署(qmacvisual之tcp服务器端)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 上面一篇&#xff0c;我们谈到了tcp客户端&#xff0c;另外一种连接方法就是tcp服务器端。事实上&#xff0c;对于第三方系统&#xff0c;大多数情…

蓝桥杯杯赛之深度优先搜索优化《1.分成互质组》 《 2.小猫爬山》【dfs】【深度搜索剪枝优化】【搜索顺序】

文章目录 思想例题1. 分成互质组题目链接题目描述【解法一】【解法二】 2. 小猫爬山题目链接题目描述输入样例&#xff1a;输出样例&#xff1a;【思路】【WA代码】【AC代码】 思想 本质为两种搜索顺序&#xff1a; 枚举当前元素可以放入哪一组枚举每一组可以放入哪些元素 操…

医院设置

广度优先和深度优先做这个题 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定…

记第一次eudsrc拿到RCE(上)

目录 前言 个人介绍 挖洞公式 漏洞介绍 CLI命令注入介绍 RCE漏洞介绍 漏洞详情 漏洞点1 漏洞点2 修复建议 总结 前言 免责声明 以下漏洞均已经上报漏洞平台。请勿利用文章内的相关技术从事非法测试。若因此产生一切后果与本博客及本人无关。 本来想大学四年都不会…

【单片机】74HC4052电路图,单片机端口复用电路

74HC4052电路图 如下图&#xff0c;还是很好理解&#xff0c;PA9、PA10是单片机引脚。 当A和B是00&#xff0c;那么就是X-COM和0X短路&#xff0c;Y-COM和0Y短路。 当A和B是01&#xff0c;那么就是X-COM和1X短路&#xff0c;Y-COM和1Y短路。 以此类推。 74HC 工艺可以直接3.…

51单片机入门_江协科技_21~22_OB记录的笔记

21. LED点阵屏 21.1. LED点阵屏介绍 •LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合&#xff0c;如汽车报站器、广告屏以及公告牌等 •LED点阵屏分类 按颜色&#xff1a;单…

通过Omnet++官网tictoc教程学习在Omnet++中构建和运行仿真 Part1Part2

introduce开始模型介绍构建项目添加 NED 文件添加C 文件添加 omnetpp.ini总结 运行仿真启动仿真程序运行仿真调试运行时错误崩溃断点调试下一事件 调试/运行 日志序列图可视化 Omnet官网 TicToc教学 introduce 在 Omnet安装完成后&#xff0c;samples/tictoc 中有该例子的完整…

windows部署Jenkins并远程部署tomcat

目录 1、Jenkins官网下载Jenkins 2、安装Jenkins 3、修改Home directory 4、插件安装及系统配置 5、Tomcat安装及配置 5.1、修改配置文件,屏蔽以下代码 5.2、新增登录用户 5.3、编码格式修改 5.4、启动tomcat 6、Jenkins远程部署war包 6.1、General配置 6.2、Sourc…

基于卷积神经网络的大米品种分类系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 大米品种分类系统&#xff0c;基于vgg16&#xff0c;resnet50卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的大米品种分类系统是在pytorch框架下实现的&#xff0c;系统中有两…

Redis中的持久化

持久化 .RDB手动触发save命令bgsave命令 自动触发bgsave的具体流程RDB的处理保存压缩校验 RDB的优缺点 AOF命令写入文件同步重写机制启动时恢复数据 本章重点回顾 . RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发 手动触发…

电子积木方案开发商

东莞市酷得智能科技有限公司电子积木方案开发商 提供消费电子解决方案、提供IC技术支持&#xff0c;全国线上线下服务 积木小车底层驱动开发过程主要涉及到以下几个方面&#xff1a; 首先&#xff0c;需要对小车底盘结构、硬件、模块等有深入的了解。底盘承载着机器人定位、导…

nvm保姆级安装使用教程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

数据采集与整理:知识图谱的根基

数据采集与整理&#xff1a;知识图谱的根基 一、 引言 在今天的数据驱动的世界中&#xff0c;知识图谱已经成为了连接复杂信息的关键工具。它们不仅推动了人工智能的发展&#xff0c;还改变了我们管理和利用知识的方式。然而&#xff0c;任何优秀的知识图谱都离不开一个核心的…

武汉星起航:跨境电商领域的领航者,助力全球贸易新篇章

自2017年以来&#xff0c;武汉星起航一直专注于亚马逊自营店铺&#xff0c;积累了宝贵的经验。2020年正式成立后&#xff0c;公司以跨境电商为核心&#xff0c;致力于为合作伙伴提供深入的合作模式。武汉星起航凭借其卓越的服务和实战经验&#xff0c;已成功助力众多创业者实现…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中&#xff0c;有一些需要使用全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID&#xff0c;但是UUID有一些缺点&#xff0c;首先他相对比较长&#xff0c…

画图理解JVM相关内容

文章目录 1. JVM视角下&#xff0c;内存划分2. 类内存分布硬核详解1. 获取堆内存参数2. 扫描堆内存&#xff0c;定位实例3. 查看实例所在地址的数据4. 找到实例所指向的类信息的地址5. 查看class信息6. 结论 3. Java的对象创建流程4. 垃圾判别算法4.1 引用计数法4.2 可达性分析…

DRF:认证(单视图或全局设置认证方案和源码分析、设置多个认证方案、如何设置不允许匿名访问)

概念&#xff1a;request.user、request.auth、认证方案authentication_classes 官网原文&#xff1a; 验证始终在视图的最开始进行&#xff0c;在执行权限和限制检查之前以及允许任何其他代码继续执行之前。 request.user 属性通常被设置为contrib.auth 包中 User 类的一个…

数学知识--(欧拉函数,快速幂,扩展欧几里得算法)

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 目录 一.欧拉函数 二.欧拉函数模板 三.用筛法求每个数的欧拉函数 四.快速幂 五.扩展欧几里得算法 六.用扩展欧几里得算法求线性同余方程 一.欧拉函数 即有一个数n&#xff0c; n通过质因数分解得到 通过欧拉函数有 证明&…

Java 程式 main 方法传参数

Java 程式运行时如果需要传递参数时&#xff0c;常用的方法有两种&#xff1a; 使用 Program Arguments 来传递值使用 VM Arguments 来传递值 1、使用 Program Arguments 来传递值 使用 Program Arguments 来传递值时&#xff0c;main 方法的写法如下&#xff1a; public st…