开发者学堂课程【Scala 核心编程 - 进阶:商品打折的相关知识点和分析】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9083
商品打折的相关知识点和分析
内容介绍:
一、样例类初步介绍
二、三个重要知识点
三、总结
一、样例类初步介绍
1.设计的介绍
首先设计一个 item,即子类,之后设计一个样例类 casebook,再设计对商品的描述和价格的说明,新的元素都可以往里面添加。
之后继承 item,让其成为 item 的一个子类,将来可以统一用 item 进行传递。紧接着设计了一个 bundle,即捆绑的意思。
abstract class Item //项
case class Book(description: String,price:Double) extends Item
case class Bundle(description: String,discount: Double,item:ltem*)extends Item
里面进行打折的说明,discount double 为打折的钱数。 item:item*是将item变成了一个可变参数,以后可以对其进行任意的变换。
紧接着继承了 item,可以 将book 传入进去,可以实现 bundle 的嵌套和再嵌套。
创建样例类
abstract class ltem//项
case class Book(description: String, price:Double)extends Item
//Bundle 捆, discount:Double 折扣,item: ltem*.
case class Bundle(description: String, discount: Double,item: ltem") extends Item匹配嵌套结构(就是Bundle的对象)
val sale= Bundle("书籍",10,Book("漫画",40),Bundle("文学作品",20,Book("《阳关》",80),Book("《围城》",30)))
上述案例中,设计的具体的事例:“书籍,10,Book(”漫画“,40),意思是漫画书40元,打折10元,紧接着bundle后面还可以添加,因此嵌套了一个bundle。上述案例表示有一捆书,单本漫画(40-10)+文学作品(两本书)(80+30-20)=30+90=120.0
创建一个saleD的demo,先设计样例类:
abstract class Item //项
case class Book(description: String,price:Double) extends Item
case class Bundle(description: String,discount: Double,item:ltem*)extends Item
给出一个具体的打折案例
abstract class ltem//项
case class Book(description: String, price:Double)extends Item
//Bundle 捆, discount:Double 折扣,item: ltem*.
case class Bundle(description: String, discount: Double,item: ltem") extends Item
二、三个重要知识点
1.知识点一:将 descr 绑定到第一个 book 的描述
请思考:如何取出
val sale = Bundle("书籍",10,Book("漫画",40),Bundle("文学作品”,20,Book("《阳关》",80),Book("《围城》",30)))
这个嵌套结构中的“漫画”
val Tes=sale match
//如果我们进行对象匹配时,不想接受某些值,则使用_忽略即可,_*表示所有case_Bundlel Book(desc *=>desc
如何取出漫画里面的内容,对对象匹配,如果要提出漫画内容,这时需要提供对象,用 case 进行提供。紧接着后面需要加入的元素,可以用“_*”来表示。
如果不想接收某些值,直接用下划线表示忽略,如果需要忽略所有,那就用“_*”来表示。如何将dac返回到book的描述。
object SalesDemo {
def main(args:Array[String]): Unit=(
//这里给出了一个具体的打折的案例
// 120.
val sale = Bundle("书籍”,10,Book("漫画”,40),BundLe(”文学作品”,20,Book("《阳关》”,80),Book(”《围城》”,30)))
//使用casd
val res = sale match
//如果我们进行对象匹配时,不想接受某些值,则使用_忽略即可, *表示所有case Bundle(_,_,Book(desc,_),_*)=> desc
此时的目标:提取出使用的case语句,得到漫画的相关值:
object SalesDeme [
def main(args: Array[String]): Unit=(
//这里给出了一个具体的打折的案例
// 120.
val sale = Bundle("书籍”,10,Book("漫画”,40),Bundle(”文学作品”,20,Book("《阳关》”,80),Book(”《围城》”,30)))
//使用case语句,得到“漫画”
valres = sale match
//如果我们进行对象匹配时,不想接受某些值,则使用。忽略即可,*表示所有case Bundle(__,Book(_),_*)=> desc
println("res="+ res)//
2.知识点二:通过@表示法直接将嵌套的值绑定到变量上。
绑定到剩余 item 到 rest
请思考:如何将“漫画”和
val sale = bundle(书籍,10,book(“漫画“,40),bundle(“文学作品”,20,book(”《阳关》”,80),book(”《围城》”,30)))
这个嵌套结构中的”漫画和“bundle(“文学作品”,20,book(”《阳关》”,80),book(”《围城》”,30)))”绑定到变量,即赋值到变量中,
vel result2 = sale match{
case bundle(_,_,art@book(_,_),rest@_*)=>(art,rest)
}
printin(result2)
printin(”art =”+result2._1)
printin(”rest=”+result2._2)
如果需要返回一整个变量名称,在前面取一个变量名称+@,art@book(_,_)表示将匹配到的对象交给art,后面所有的对象交给res。
然后将其整理成元组的形式返回,慢慢出现了递归的概念。
//知识点2-通过@表示法将嵌套的值绑定到变量。 *绑定剩余Item到rest
val res2 = sale match {
//如果我们进行对象匹配时,不想接受某些值,则使用。忽略即可, 表示所有
case Bundle(__,art @ Book(__), rest @ 米 =>(art, rest)
}
println("res="+ res)
}
}
执行结果如下:
D:\program\jdk8\bin\java.
res=漫画
res2=(Book(漫画,40l0),WrappedArray(Bundle(文学作品,20.0,WrappedArray(Book(《阳关》,80.0),Book(《围城》,30.0)))))
process finished with exit code 0
3.知识点三:不适用_*绑定剩余的item到rest
如果只想绑定一个bundle,则把*去掉。
请思考:如何将“漫画”和bundle(“文学作品”,20,book(”《阳关》”,80),book(”《围城》”,30)))部分
val sale = bundle(书籍,10,book(“漫画“,40),bundle(“文学作品”,20,book(”《阳关》”,80),book(”《围城》”,30)))
这个嵌套结构中的”漫画和bundle(“文学作品”,20,book(”《阳关》”,80),book(”《围城》”,30)))绑定到变量,即赋值到变量中
vel result2 = sale match{
//说明因为没有使用_*即明确说明没有多个bundle,所以返回的rest,就不是wrappedarray了
case bundle(_,_,art@book(_,_),rest@_*)=>(art,rest)
}
printin(result2)
printin(”art =”+result2._1)
printin(”rest=”+result2._2)
根据上述知识点设计如下语句
//知识点3-不使用_*绑定剩余 Item 到 rest
Val res3 = sale match
//如果我们进行对象匹配时,不想接受某些值,则使用。忽略即可, -*表示所有
case Bundle(_, _,art3@ Book(_,_),rest3)=>(art3, rest3)
}
println("res3="+ res3)
}
}
//设计样例类
abstract class Item // 项
case class Book(description: String, price: Double) extends Item
case class Food(description: string, price: Double) extends Item
//Bundle捆, discount:Double 折扣, item: Item*
case class Bundle(description: String, discount: Double,item:Item*) extends Item
执行结果如图所示:
D:programGak8 bin java…
res=漫画
res2=(Book(漫画,40.0),WrappedArray(Bundle(文学作品,20.0,WrappedArray(Book(《阳关》,80.0),Book(《围城》,30.0)))))
Process finished with exit code 0
三、总结
讲述了匹配嵌套结构,首先提出了一个需求,基本介绍了一下该结构,提出完成该案例的具体要求。
基本介绍
操作原理类似于正则表达式
最佳实践案例-商品捆绑打折出售
现在有一些商品,请使用Scala设计相关的样例类,完成商品捆绑打折出售。要求
1)商品捆绑可以是单个商品,也可以是多个商品。
2)打折时按照折扣x元进行设计.
3)能够统计出所有捆绑商品打折后的最终价格
接下里一步步分析:
第一步:创建样例类
第二步:匹配嵌套结构,给出了一个具体案例。
第三步:为了更好的理解案例,补充了三个知识点。
(1)将 descr 绑定到第一个 book 的描述
(2)知识点二:通过@表示法直接将嵌套的值绑定到变量上。
(3)知识点三:不适用_*绑定剩余的 item 到 rest
第四步:提出了解决方案。