开发者学堂课程【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
}
}