商品打折的最终解决 | 学习笔记

简介: 快速学习商品打折的最终解决

开发者学堂课程【Scala 核心编程 - 进阶商品打折的最终解决学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9084


商品打折的最终解决


内容介绍:

一、匹配嵌套结构

二、总结


一、匹配嵌套结构

此案例的需求:

现有许多商品,请使用 scala 设计相关样例类,完成商品的捆绑打折销售。

要求一:可以对多个商品或者一个商品进行打折。

要求二:打折时按照扣x元来进行打折

要求三:能够统计出所有捆绑商品打折后的最终价格

def price(it: item): double ={

it match {

case book(_,p)=> p

//生成一个新的集合,_是将its中每个循环的元素传递到price的it中,递归操作,分析一个简单的流程

case bundle (_,disc,its@_*)=>its.map(price _).sum-disc

}

}

创建一个 price,用来接收 item,返回 double。

It 匹配:

如果是一本书,直接返回。如果是一个 double,着重点在于打折的钱数。

Its 后面紧跟一个bundle集合全部取出交给its,于是又使用了its.map去调用price,进行递归计算,最后求和减去打折,打折一层一层进行。

代码分析:

def price(it: item): double ={

it match {

case book(_,p)=> p

//生成一个新的集合,_是将its中每个循环的元素传递到price的it中,递归操作,分析一个简单的流程

case bundle (_,disc,its@_*)=>its.map(price _).sum-disc

 }

}

1.its.map(price).sum -10【its集合book(“漫画”,40))】

2.case book(_,p)=>p=>40

3.40-10 = 30

里面的 map 会再次执行 price,its 是一个集合,里面只有一个book,相当于给price 传递的只有一个 book,case Book(_,p)=>p

会把 p 提取出来,因为用的是样例类。即对象的提取,整个会返回40,返回调用的位置。

将“val sale = Bundle(”书籍”,10,Book(“漫画,40”))看做一个整体。

案例的完成:

Price 接受一个 its,最后的 item 会整个返回 double 类型做一个 match 的匹配。首先检查是否为一个 book,如果是,看中的是它的价格。

如果不是 book,而是一个 bundle,看重的是打折和后面的部分,将其全部取出。Its map 运用递归,一步步进行调用。整个完成后进行求和,最后减掉打折金额即disc。代码如下:

println("price="+ price(sale)) // 120

def price(it:Item): Double =

it match

case Book(_p)=> p

case Bundle(_,disc,its@ *)=> its.map(price).sum - disc

此模式比较综合,结合了 map,递归等语法。

用price传入sale,整个的结果会等于120,打印出来之后,执行结果如下:

D:\program\jdk8\bin\java·..

res=漫画

res2=(Book(漫画,40.0),WrappedArray(Bundle(文学作品,20.0,WrappedArray(Book(《阳关》,80.0),Book(《围城》,30.0)))))

res3=(Book(漫画,40.0),Bundle(文学作品,20.0,WrappedArray(Book(《阳关》,80.0),Book(《围城》,30.0))))

price=120.0

Process finished with exit code 0


二、总结

现在有一些商品,请使用 Scala 设计相关的样例类,完成商品可以捆绑打折出售。

要求

1)商品捆绑可以是单个商品,也可以是多个商品

2)打折时按照折扣 xx 元进行设计.

3)能够统计出所有捆绑商品打折后的最终价格

对应的代码和分析

def price(it:Item):Double=(

it match

case Book(_,p)=>p

case Bundle(_,disc,its @ ) => its.map(price).sum - disc

}

}

相关文章
|
SQL 数据采集 DataWorks
基于DataWorks的多场景实践及数据开发Data Studio最新体验测评
DataWorks是阿里云推出的一站式智能大数据开发治理平台,自2009年发布以来,历经多次迭代,成为企业数字化转型的重要工具。本文通过多个实践案例,如公共电影票房数据预处理,展示了DataWorks如何帮助企业高效处理大数据,涵盖数据集成、ETL开发、数据分析及治理等全流程。最新版DataWorks引入了智能助手Copilot,进一步提升了用户体验和工作效率。
|
10月前
|
图形学
Unity时间转换方式
**时间戳与 DateTime 的转换简介** 时间戳是从1970年1月1日00:00:00起的秒数,可转为 DateTime 对象。DateTime 转时间戳则是计算与1970年1月1日的时间差。秒数与时分秒格式互转基于60进制换算规则。Unity 中可通过 Time 类处理游戏时间,并与其他时间格式进行换算,需考虑时区等差异。示例代码展示了 Unity 中计时器的实现及总用时转换成时分秒的两种方法。
737 10
|
SQL 自然语言处理 数据库
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
|
存储 关系型数据库 MySQL
InnoDB为什么使用自增id作为主键?
MySQL以数据页(默认16K)为单位存储数据。自增ID主键时,写满一页直接申请新页;非自增ID主键需保持索引有序,插入数据可能引发页分裂,即需将部分数据移至新页,影响插入效率。
197 6
Electron-store 存储数据的大小限制
【10月更文挑战第18天】虽然无法给出一个确切的数字来表示 Electron-store 的存储数据大小限制,但通过对相关因素的分析和理解,我们可以更好地管理和利用这一存储工具,为应用的稳定运行提供保障。同时,随着技术的不断发展和进步,未来可能会有更优化的存储解决方案出现,进一步拓展我们的存储能力和应用场景。
|
开发框架 安全 JavaScript
xss漏洞原理(四)自动化XSS
xss漏洞原理(四)自动化XSS
|
网络协议 前端开发
wireshark抓包新手使用教程
Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。
24783 0
wireshark抓包新手使用教程
|
存储 BI 定位技术
高德Android高性能高稳定性代码覆盖率技术实践
高德这套全新的方案,简洁而不简单,巧妙地实现了无Hack采集,在保证高稳定性和不侵入源码的前提下,优雅地实现了生产环境代码覆盖率的高性能采集,已经过高德地图多版本验证,是一套成熟、稳定且高效的方案。
高德Android高性能高稳定性代码覆盖率技术实践
|
机器学习/深度学习 供应链 大数据
商品销量预测介绍|学习笔记
快速学习商品销量预测介绍
1315 0
商品销量预测介绍|学习笔记
|
机器学习/深度学习 供应链 算法
商品销量预测方法|学习笔记
快速学习商品销量预测方法
2834 0
商品销量预测方法|学习笔记