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;

    @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 是一种思维转变,从传统的命令式编程转变为函数式编程。因此,练习帮助我们思考流数据流中的逻辑很重要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

file_get_contents(‘php://input‘); 这个postman要如何传参

在 Postman 中传递参数给 file_get_contents(php://input); 是通过请求的 Body 部分来实现的。使用 Postman 进行 API 接口测试时&#xff0c;可以按照以下步骤来传递参数&#xff1a; 打开 Postman 并创建一个新的请求。在请求的 URL 地址栏输入你的 API 地址。选择请求方法为…

【Python面试题收录】Python的深浅拷贝

一、Python的深浅拷贝的区别 在Python中&#xff0c;深拷贝和浅拷贝是两种不同的对象复制机制&#xff0c;它们的主要区别在于如何处理对象内部所包含的可变或不可变类型的子对象。 浅拷贝 是指创建一个新的对象&#xff0c;但它只复制了原对象的第一层内容&#xff0c;也就是说…

基于模糊PID控制器的的无刷直流电机速度控制simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1无刷直流电机模型与速度控制 4.2 模糊PID控制器设计 5.完整工程文件 1.课题概述 基于模糊PID控制器的的无刷直流电机速度控制simulink建模与仿真。基于模糊PID控制器的无刷直流电机&#xff08;Brus…

并发编程01-深入理解Java并发/线程等待/通知机制

为什么我们要学习并发编程&#xff1f; 最直白的原因&#xff0c;因为面试需要&#xff0c;我们来看看美团和阿里对 Java 岗位的 JD&#xff1a; 从上面两大互联网公司的招聘需求可以看到&#xff0c; 大厂的 Java 岗的并发编程能力属于标配。 而在非大厂的公司&#xff0c; 并…

Redis的高可用和持久化

目录 一、Redis高可用 二、Redis持久化 2.1 持久化的功能 2.2 Redis提供两种方式进行持久化 三、RDB持久化 3.1 触发条件 3.1.1 手动触发 3.1.2 自动触发 3.1.3 其他自动触发机制 四、AOF持久化 4.1 开启AOF 4.2 执行流程 4.2.1 命令追加 (append) 4.2.2 文件写入…

蓝桥杯-单片机基础13——完美代码:官方开发板超声波传感器详解(超声波传感器CX20106A)

蓝桥杯单片机组备赛指南请查看 &#xff1a;本专栏第1篇文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K61S2 &#xff08;使…

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(二、三)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 实验二&#xff1a; 1. 为nvme0n2p1设备建立配额属性和文件(EXT) 2. 要求自己名字的用户只能存储不超过200M的文件&#xff0c;总数量不能大于10个 quotacheck [选项] 文件系统 edquota quotaon [选项] 文件系…

全志 Linux Qt

一、简介 本文介绍基于 buildroot 文件系统的 QT 模块的使用方法&#xff1a; • 如何在 buildroot 工具里编译 QT 动态库&#xff1b; • 编译及运行 qt_demo 应用程序&#xff1b; • 适配过程遇到的问题。 二、QT动态库编译 在项目根路径执行 ./build.sh buildroot_menuc…

蓝桥杯—DS1302

目录 1.管脚 2.时序&官方提供的读写函数 3.如何使用读写函数 4.如何在数码管中显示在DS1302中读取出的数据&#xff1f; 1.管脚 2.时序&官方提供的读写函数 /* # DS1302代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行…

Python网络爬虫(一):HTML/CSS/JavaScript介绍

1 HTML语言 1.1 HTML简介 HTML指的是超文本标记语言&#xff1a;HyperText Markup Language&#xff0c;它不是一门编程语言&#xff0c;而是一种标记语言&#xff0c;即一套标记标签。HTML是纯文本类型的语言&#xff0c;使用HTML编写的网页文件也是标准的文本文件&#xff0c…

代码重用攻击及栈溢出攻击

攻击一个软件曾经就像找到一个缓冲区溢出漏洞一样简单&#xff0c;用要执行的任意代码填充缓冲区并替换返回地址以指向这个新代码的开头。幸运的是&#xff0c;我们现在防止内存区域既可写又可执行&#xff0c;攻击者要么不能覆盖现有的代码&#xff0c;要么不能执行他们注入的…

蓝桥杯 204/4/2

目录 蚂蚁感冒 “蓝桥杯”练习系统 (lanqiao.cn) 时间显示 “蓝桥杯”练习系统 (lanqiao.cn) 蚂蚁感冒 “蓝桥杯”练习系统 (lanqiao.cn) 思路借鉴&#xff1a;AcWing 1211. 蚂蚁感冒 - AcWing 完整代码&#xff1a; #include <bits/stdc.h> #define int long lon…

蓝桥杯第八届c++大学B组详解

目录 1.购物单 2.等差素数列 3.承压计算 4.方格分割 5.日期问题 6.包子凑数 7.全球变暖 8.k倍区间 1.购物单 题目解析&#xff1a;就是将折扣字符串转化为数字&#xff0c;进行相加求和。 #include<iostream> #include<string> #include<cmath> usin…

ABC319 G - Counting Shortest Paths

解题思路 按照到的距离远近&#xff0c;进行分层为第一层分层步骤&#xff1a;用一个集合记录还未定层的点&#xff0c;用逐层确定对于当前点与其有连边的&#xff08;不是删边&#xff09;且还未确定的点&#xff0c;确定为的下一层&#xff0c;入队列没连边且还未确定的点&a…

适用于车载设备无钥匙进入系统汽车用晶振FA-238A

汽车用晶振FA-238A是一款适用于车载设备无钥匙进入系统的耐高温晶振。汽车用晶振FA-238A是爱普生推出一的款MHz表贴式晶体单元&#xff0c;具有很好的预率性能&#xff0c;符合AEC-0200标准&#xff0c;其封装尺寸仅为3.2x2.5x0.7mm&#xff0c;工作温度范围在-40℃~125℃之间&…

市场复盘总结 20240402

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 50% 最常用的二…

最新版两款不同版SEO超级外链工具PHP源码

可根据个人感觉喜好自行任意选择不同版本使用&#xff08;版V1或版V2&#xff09; 请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09;修复优…

探索牙科业务架构的优化与整合解决方案

在现代医疗领域中&#xff0c;牙科作为一个重要的分支&#xff0c;其业务架构和整体解决方案的优化与整合&#xff0c;对于提高诊疗效率、提升患者体验以及促进口腔健康水平具有重要意义。本文将深入探讨牙科业务架构的优化方向和整体解决方案&#xff0c;为牙科行业的发展提供…

基于SSM的“汽车销售分析与管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“汽车销售分析与管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 销售经理系统首页图 客户管理图 车辆…

27.ReentrantLock

1.与synchronized不同点&#xff1a; 可中断可以设置超时时间可以设置公平锁&#xff0c;公平锁就是为了解决饥饿线程&#xff0c;让线程排队&#xff0c;先进先出&#xff0c;先来的线程先执行。支持多个条件变量 2.与synchronized相同点都支持锁的可重入。 基本格式&#…