黑马苍穹外卖--再来一单(stream流转换、赋值与收集映射)

1.首先明确一下业务规则:

业务规则:

  • 再来一单就是将原订单中的商品重新加入到购物车中

2.产品页面原型和开发接口文档

3.业务层逻辑代码开发
3.1 查询方向

我们要明确的是:

  • 再来一单就是将原订单中的商品重新加入到购物车中------直接把商品加入到购物车,不需要查找orders对象,我们直接利用参数id查询当前订单详情,包括菜品信息以及喜好或者套餐信息。

3.2 将订单详情对象转换为购物车对象

此次对象的转换我们使用到的是:orderDetailList.stream().map(x->){ }

 List<ShoppingCart> shoppingCartList =orderDetailList.stream().map(x->{
          //这里的x代表的是  orderDetailList集合中每一个元素
          ShoppingCart shoppingCart=new ShoppingCart();
            return shoppingCart;
        })

         这里,orderDetailList是一个列表(经过查询数据后的结果),而 stream() 方法会将其转换为一个流(Stream),以便进行一系列的函数式操作。

        先将orderDetailList转换为一个Stream,然后使用map操作将每个OrderDetail对象转换为ShoppingCart对象。

        map 是Stream API中的一个中间操作,它接受一个函数作为参数,并将该函数应用到流中的每一个元素上。这里的 x 是流中元素的占位符,你可以通过 x 来引用流中的每一个元素,并对其进行某种转换或操作。

注!!!: map操作必须返回一个对象

        例如,假设你有一个 OrderDetail 类,它有一个 price 属性,你想得到所有订单详情的价格之和。你可以这样做:

List<OrderDetail> orderDetailList = // ... 获取订单详情列表
​
double totalPrice = orderDetailList.stream()
    .map(orderDetail::getPrice) //将每个OrderDetail对象转换为它的价格(假设getPrice是获取价格的方法)
    .mapToDouble(Double::doubleValue) //将Stream<BigDecimal>转换为Stream<Double>(如果price是BigDecimal类型)
    .sum(); //计算价格的总和

        在上面的代码中,OrderDetail::getPrice 是一个方法引用,它等价于 x -> x.getPrice()。这意味着对于 orderDetailList 中的每个 OrderDetail 对象 x,我们都在调用其 getPrice() 方法来获取价格。

  mapToDouble 方法是将Stream中的元素转换为一个double值的流,这里假设 getPrice() 返回的是 BigDecimal 类型,我们需要将其转换为 double 以便进行数学运算。

        最后,sum() 方法计算了所有价格的总和。

请注意,Stream API 提供了丰富的中间操作和终止操作,允许你以声明式的方式处理集合数据。中间操作会返回一个新的流,而终止操作会返回一个非流的结果,或者执行某种副作用。

3.3 将原订单详情里面的菜品信息重新复制到购物车对象中
BeanUtils.copyProperties(x, shoppingCart, "id");

        使用Java的Stream API和Apache Commons BeanUtils库来orderDetailList中的OrderDetail对象转换为ShoppingCart对象列表。

        BeanUtils.copyProperties( )的第三个参数是一个用来指定要排除的属性名(参数),即忽略哪个参数

为什么要根据id参数值忽略某些数据:

        我们在进行再来一单业务逻辑处理前,首先在浏览界面对所选菜品或套餐进行加入购物车操作,在这一操作中,购物车中的id代表自身序号,接入一份数据便会++;在支付成功之后购物车中的数据会自动删除。由于购物车属性shopping_cart与订单属性orders性质不同,若是把订单属性中的id强加给购物车,信息紊乱无法使用。

3.4 收集Stream中映射后的对象
.collect(Collectors.toList());
  • 使用了Collectors.toList()来收集Stream中映射后的所有ShoppingCart对象到一个新的列表中。

完整代码如下:

public void repetition(long id) {
        //根据id查询到原来订单中菜品信息
        List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);
​
        //查询当前用户id
        Long userId = BaseContext.getCurrentId();
​
        // 将订单详情对象转换为购物车对象
        List<ShoppingCart> shoppingCartList =orderDetailList.stream().map(x->{
          //这里的x代表的是  orderDetailList集合中每一个元素
          ShoppingCart shoppingCart=new ShoppingCart();
​
          // 将原订单详情里面的菜品信息重新复制到购物车对象中
            BeanUtils.copyProperties(x,shoppingCart,"id");
            shoppingCart.setUserId(userId);
            shoppingCart.setCreateTime(LocalDateTime.now());
​
            return shoppingCart;
        }).collect(Collectors.toList());//Collectors.toList()来收集Stream中映射后的所有ShoppingCart对象到一个新的列表中
​
        //将购物车对象批量添加到数据库
        shoppingCartMapper.insertBatch(shoppingCartList);
    }

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

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

相关文章

《经典论文阅读1》YouTubeDNN—基于深度学习的搜推系统开山之作

论文链接&#xff1a; https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf全文由『说文科技』原创出品。版权所有&#xff0c;翻版必究。 这篇发表于2016年九月的文章&#xff0c;在搜索推荐仍然基于矩阵分解的时代&#xff0c;抛…

架构师系列-搜索引擎ElasticSearch(二)

索引类型 正排索引 一个简单版的B树索引大概是&#xff1a;叶子节点存放完整的数据&#xff0c;非叶子节点存放建立对应聚簇索引对应的字段&#xff08;主键&#xff09;&#xff0c;一条可以使用聚簇索引的SQL&#xff0c;会依次从上往下进行B树的查找。 create table user…

读所罗门的密码笔记20_更好的自己

1. 民营部门 1.1. 障碍最大的一步&#xff0c;与履行协议所需要的人才和技能有关 1.2. 多样性很好&#xff0c;不要过分依赖任何一种资源&#xff0c;因为政府会出于政治原因淡化问题&#xff0c;不尊重科学&#xff0c;甚至退出协议 1.2.1. 民营部门和非政府组织的强大联盟…

康耐视visionpro-CogFindCircleTool操作工具详细说明

◆CogFindCircleTool]功能说明: 通过用多个卡尺找到多个点来拟合所要找的圆 ◆CogFindCircleTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加CogFindCircleTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入源 ③预期的圆弧:设置预期圆弧的…

第6章:6.4.2 案例二:爬取成语网站数据 (MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 本案例用到的网址为&#xff1a;成语大全列表成语大全列表https…

NUC11更新 ESXi 8.0U2B 安装过程

1、下载 镜像名称&#xff1a;VMware-VMvisor-Installer-8.0U2b-23305546.x86_64.iso下载地址&#xff1a;https://docs.vmware.com/tw/VMware-vSphere/8.0/rn/vmware-vsphere-80-release-notes/index.html 2、制作镜像启动盘 2、查看镜像版本信息 3、启动设备安装系统 1、启…

web3项目自动连接小狐狸以及小狐狸中的各种“地址”详解

刚做web3的时候&#xff0c;比较迷糊的就是人们口中说的各种地址&#xff0c;小狐狸钱包地址&#xff0c;私钥地址&#xff0c;跳转地址&#xff0c;接口地址&#xff0c;交易地址&#xff0c;等等XX地址&#xff0c;常常感觉跟做链的同事们说话不在一个频道。 这一小节&#x…

【C Hash Map from Redis】

将Redis源码中的哈希表底层逻辑提取&#xff0c;并进行最小demo级测试将对应文件抽出&#xff0c;通过宏替换等方式保证源码编译通过main.c编写测试demo &#xff0c;注册哈希函数和值比较函数&#xff08;必选项&#xff09; /* Hash Tables Implementation.** This file imp…

二、Flask会话技术和模板语言

Cookie Session # views.py: 路由 视图函数 import datetimefrom flask import Blueprint, render_template, request, redirect, session from .models import *# 蓝图 blue Blueprint(user, __name__)# 首页 可以写两个路由&#xff0c;都是访问同一个函数 blue.route(/) b…

java数据结构与算法刷题-----LeetCode371. 两整数之和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 位运算 位运算 解题思路&#xff1a;时间复杂度O( l o g 2 m a …

自顶向下的语法分析器

一、问题及解决&#xff1a; 什么是Dictionary File&#xff1f; 这种类型的文件为Windows虚拟PC 2007&#xff0c;虚拟机&#xff0c;它允许一些版本的Windows在一台计算机上运行生成。它包括像发音和单词的定义以及各种语言&#xff0c;如德国和法国的辞典数据。 如何实现语…

2024/4/15 AD/DA

AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号 DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换为模拟信号 AD/DA转换打开了计算…

代码学习记录42---动态规划

随想录日记part42 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.14 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;最长递增子序列 &#xff1b;最长连续递增序列 &#xff1b;最长重复子数组 ;最长公…

5G网络开通与调测ipv4

要求如下&#xff1a; 1. 勘站规划 1. 【重】首先观察NR频点&#xff0c;完成设备选型 2645--选择N41 3455--选择N78 4725--选择N79 设备选型如下&#xff1a;观察AAU的通道数&#xff0c;最大发射功率&#xff1b;选择N41的选型频段也要选41 2. …

算法:位运算

算法&#xff1a;位运算 常见位运算操作基本题型模拟加法数字查找总结 常见位运算操作 在C/C中&#xff0c;有比较丰富的位运算操作符&#xff0c;常见的有&#xff1a; &&#xff1a;按位与 |&#xff1a;按位或 ~&#xff1a;按位取反 ^&#xff1a;按位异或 <<&a…

stm32开发之threadx+modulex组合开发使用记录

前言 参考博客 论坛官方资料: 微软开发板核心芯片使用的是stm32f407zgtx&#xff0c;烧录工具使用的是jlink模块的构建使用的是脚本进行构建网上针对modulex的资料较少&#xff0c;这里做个记录 项目结构 逻辑框架 主程序代码 主函数 /** Copyright (c) 2024-2024&#xff0…

ansible创建用户账户和更新ansible库的密钥

1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表&#xff0c;并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook &#xff0c;从⽽…

空指针与野指针的辨析

空指针 空指针不指向任何实际的对象或者函数&#xff0c;反过来&#xff0c;任何的对象或者函数也不可能是空指针。 在程序中得到空指针的办法就是使用预定义的NULL&#xff0c; int *ip NULL; 校验一个指针是否为空指针可以用 if (ip NULL) NULL是标准规定的宏定义&am…

使用spring-ai快速对接ChatGpt

什么是spring-ai Spring AI 是一个与 Spring 生态系统紧密集成的项目&#xff0c;旨在简化在基于 Spring 的应用程序中使用人工智能&#xff08;AI&#xff09;技术的过程。 简化集成&#xff1a;Spring AI 为开发者提供了方便的工具和接口&#xff0c;使得在 Spring 应用中集…

Unity类银河恶魔城学习记录12-13 p135 Merge Skill Tree with Dogge skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​​​​​​ Inventory.cs using System.Collections.Generic; using Un…