当前位置: 首页 > article >正文

《苍穹外卖》项目学习记录-Day11销量排名统计

销量排名需要查两张表,一张是order_detail,它里面有number字段,这个字段体现了商品的销售的份数。我们仅仅查这一张表是不够的,因为用户下单了,下单了之后就会产生订单数据和对应的订单详情数据,假设他下完单了又取消了这个订单,他取消这个订单后我们并没有把这个数据给删除掉,我们只是把订单的状态修改成已取消。对于这种情况用户已经取消了订单了,我们在统计销量排名的时候,这个数据不能算数。所以我们要统计的是这个订单是已完成状态的,order_detail表体现不出来对应的订单状态,order_detail里面有order_id,想要知道对应的订单状态就需要根据order_id去查订单表。所以要查两张表,一张是order_detail(订单详细表),一张是orders(订单表),订单表里面status=5代表订单已完成,status=6代表订单已取消。

所以这条sql语句应该为查询order_detail表和orders表,查询菜品或套餐的名字以及对应的销售的份数,当order_detail.order_id =orders.id的时候并且orders表中的status字段=5,也就是已完成的订单,而且是在指定的时间段内,进行分组查询,根据销量降序排序,查询销量前10个的商品。

用GoodsSalesDTO来封装我们查询出来的结果。

这里用Stram流的map方法获取每一个GoodsSalesDTO对象里面的name和number。

    /**
     * 统计指定时间区间内的销量排名前10
     * @param begin
     * @param end
     * @return
     */
    public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) {
        LocalDateTime beginTime = LocalDateTime.of(begin,LocalTime.MIN);
        LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX);
        List<GoodsSalesDTO> salesTop10 = orderMapper.getSalesTop10(beginTime, endTime);
        List<String> names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());
        String nameList = StringUtils.join(names, ",");
        List<Integer> numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList());
        String numberList = StringUtils.join(numbers, ",");
        return SalesTop10ReportVO
                .builder()
                .nameList(nameList)
                .numberList(numberList)
                .build();

    }

 ·功能测试

1.获取Stream流?

·获取集合的Stream流

Collection提供的如下方法         说明

default Stream<E> stream()      获取当前集合对象的Stream流

·获取数组的Stream流

Arrays类提供的如下方法            说明

public static <T> Stream<T> stream(T[] array)  获取当前数组的Stream流

public static <T> Stream<T> of(T...values)         获取当前接收数据的Stream流

中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。

终结方法指的是调用完成后,不会返回新的Stream了,没法继续使用流了。

2.Stream提供的常用中间方法     说明

Stream <T> filter(Predicate<? super T>predicate)    用于对流中的数据进行过滤

Stream <T> sorted()                                                  对元素进行升序排序

Stream <T> sorted(Comparator<? super T> comparator) 按照指定规则排序

Stream <T> limit(long maxSize)                                 获取前几个元素

Stream <T> skip(long n)                                             跳过前几个元素

Stream <T> distinct()                                                  去除流中重复的元素

<R>Stream<R> map(Function<? super T,?extends R> mapper)

对元素进行加工,并返回对应的新流

static <T> Stream<T> concat(Stream a,Stream b)     合并a和b两个流为一个流

3.Stream流常见的终结方法

Stream提供的常用终结方法               说明

void forEach(Consumer action)          对此流运算后的元素执行遍历

long count()                                         统计此流运算后的元素个数

Optional<T> max(Comparator<? super T> comparator)

获取此流运算后最大值元素

Optional<T> min(Comparator<? super T> comparator)

获取此流运算后最小值元素

收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回。

Stream流:方便操作集合/数组手段;集合/数组:才是开发中的目的。

Stream提供的常用终结方法                说明

R collect(Collector collector)                把流处理后的结果收集到一个指定的集合中去

Object toArray()                                   把流处理后的结果收集到一个数组中去

流只能收集一次

Collectors工具类提供了具体的收集方式             说明

public static <T> Collector toList()                       把元素收集到List集合中去

public static <T> Collector toSet()                       把元素收集到Set集合中去

public static Collector toMap(Function KeyMapper,Function valueMapper)

把元素收集到Map集合中

我的笔记中没有这个Stream.reduce()方法和Stream.map()方法,所以我去查了一下。

Stream.reduce()是Java 8引入的一个强大的工具,用于对流中的元素进行归纳操作。

reduce方法可以将流中的多个元素组合成一个单一的结果,通常用于求和、求乘积、查找最大值或最小值等操作。

reduce方法的基本用法

reduce(BinaryOperator<T> accumulator)

这种方法没有初始值,流的第一个元素将作为初始值。返回的是Optional<T>,以防流为空。例如:

Optional<Integer> sum = list.stream().reduce((a,b)->a + b);

2.有初始值‌:T reduce(T identity, BinaryOperator<T> accumulator)。这种方法有一个初始值identity,可以保证即使流为空也会有一个默认结果。返回的是T。例如:
int sum = list.stream().reduce(0, (a, b) -> a + b);
‌3.并行流操作‌:reduce(U identity, BiFunction<U, T, U> accumulator, BinaryOperator<U> combiner)。这种方法适用于并行流操作,可以通过两个函数实现累加器和合并器的分离。例如:
int sum = list.parallelStream().reduce(0, (partialResult, element) -> partialResult + element, Integer::sum);
reduce方法的应用场景
‌1.求和‌:将流中的所有元素相加。例如,计算一个整数列表的总和。
‌2.求乘积‌:将流中的所有元素相乘。例如,计算一个整数列表的乘积。
‌3.查找最大值或最小值‌:通过比较操作,找到流中的最大值或最小值。
‌4.连接字符串‌:将流中的字符串元素连接成一个新的字符串。例如,将多个单词连接成一个句子。
‌5.自定义聚合操作‌:通过自定义的累加器函数,实现更复杂的聚合操作。例如,计算两个数的平均值。

Stream.map()方法是Java 8中Stream API的一个重要功能,主要用于将流中的每个元素映射到另一个元素。具体来说,map方法接受一个Function接口的实现,该实现定义了如何将流中的每个元素转换成一个新的元素。转换后元素会形成一个新的流。

基本用法

map方法的声明如下:

<R> Stream<R> map(Function<? super T,? extends R>mapper);

这里,T是流中元素的类型,R是映射后元素的类型。mapper是一个函数式接口,定义了如何将T类型的元素转换为R类型的元素。

特性与优势

1.类型转换:可以将流中的元素转换为另一种类型,例如将字符串转换为整数。

2.惰性执行:map操作不会立即执行,只有在需要结果时才会计算。

3.函数式编程:使用函数式接口(如Function),使得代码更加简洁和灵活。

 


http://www.kler.cn/a/531787.html

相关文章:

  • 【1】快手面试题整理
  • Spring 面试题【每日20道】【其二】
  • ieee模版如何修改参考文献的格式以及多作者省略等
  • 【Unity3D】Tilemap俯视角像素游戏案例
  • Day33【AI思考】-分层递进式结构 对数学数系的 终极系统分类
  • pytorch实现基于Word2Vec的词嵌入
  • JavaScript系列(55)--安全编程实践详解
  • 代码随想录二刷|二叉树7
  • Leetcode 3440. Reschedule Meetings for Maximum Free Time II
  • 刷题汇总一览
  • 在Vue3项目中使用百度地图
  • vscode flutter 项目连接 mumu 浏览器
  • BUUCTF Pwn axb_2019_brop64 题解
  • aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API
  • C++泛型编程指南07 函数重载
  • 来自谷歌新作:SFT负责记忆遵循,RL驱动泛化迁移?
  • Use-DeepSeek增效
  • 将D盘空间划分给C盘
  • 大年初六,风很大
  • 自研有限元软件与ANSYS精度对比-Bar2D2Node二维杆单元模型-四连杆实例
  • 华为OD机试E卷 --智能成绩表--24年OD统一考试(Java JS Python C C++)
  • GRN前沿:利用DigNet从scRNA-seq数据中生成基于扩散的基因调控网络
  • Linux:指令大全(二)
  • OpenAI推出Deep Research带给我们怎样的启示
  • 物业管理系统源码提升社区智能化管理效率与用户体验
  • 使用IDEA社区版搭建Springboot、jsp开发环境