开发者学堂课程【Scala 核心编程 - 进阶:样例类应用实例和中置表达式】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9081
样例类实例应用和中置表达式
内容介绍:
一、样例类的实践例子
二、中置表达式
一、样例类的实践例子
体验样例类方式进行对象匹配
1.代码介绍
当我们有一个类型为 Amount 的对象时,可以用模式匹配他的类型,并将属性值绑定到变量,(即:把样例类对象的属性值提取到某个变量上,该功能有用)
样例类最佳实践1:
当有一个类型为 Amount 的对象时,可以用模式匹配来匹配他的类型,并将属性值绑定到变量(即:把样例类对象的属性值提取到某个变量,该功能有用)for (amt <- Array(Dollar(1000.0), Currency(1000.0, "RMB"), NoAmount)) (
val result = amt match [
I/说明
case Dollar(v) => "S" + v
1/说明
case Currency(v u) =>v+"u
case NoAmount
printin(amt " + result)
【案例演示+代码说明】
for(amt<.Array(Dollar(1000.0).Currency(1000.0,”RMB”),NoAmount)){
Val result = amt match{
//说明
Case Dollar(v) =>”$”+ v
//说明
case Currency(v,u)=>v+””+u
Case NoAmount =>””
}
Printin(amt +””+result)
{
该命令的第一条语句为 for 循环语句,对数组进行循环,数组里面有 dollar,currency 和 NoAmount 的对象实例,用match匹配,匹配dollar。对象匹配触发dollar 的 unapply 方法。这个方法已经自带了,不需要自己输入,会严格按照设置的机制返回。
运行结果
当从数组里面取出dollar2的实例时,程序会按照match匹配机制依次去匹配。
匹配到样例类时,会把对象传入到unapply里面,并将对象返回v。此案例的作用就是体验使用样例类方式进行对象匹配的优越性和简介性。
下图为运行结果:
D:\program\jdk8\bin\Java
Dolar2(1000.0): $1000.0
Currency2(1000.0,RMB):$1000.0. RMB
NoAmount2:
Process finished with exit code 0
2.Copy 操作
样例类中有一个 copy 方法,可以带有名参数,copy 可以创建一个新对象,类似于Java 里面的克隆,去完成对一个类型参数的拷贝。
5 val amt = new currency3(3000.0,”RMB”)
对于上述语句,快速创建一个与amt相同属性值的变量,此时可以用到copy语句。如图:
对于此类例子的实践应用如下:
package com.atguigu.chapter12.casepak
object CaseClassDemoe3 {
defmain(args: Array(String)):unit
val ant e new Currency3(3000,O."AMB"
val ant2 ant.copy() 克隆、创建的对象和amt的属性一样
printin("ant2.value' ant2:value amt2.umitz ant2.unit)
)
)
abstractclass Atount)
Case class Dollar(valuei Double extends anounti //样例类
Case classCurreecy(values:Double,unit:string) extends Amount3//样例类
ease coject NoAnount) extends Amount3
运行结果如下:
D:\program\jdk8\bin\java·r
D:\program\jdk8\bin\java"-javaagent:D:\program\ideamynew\Intelli] IDEA 2017.2.5\lib\idea_rt.jar=50838:D:\program\ideamynew\In
Process finished with exit code o
当在进行对象克隆时,需要改变某个值,例如改变上图中3000这个数值,其余不变。
则指定这个参数名,在拷贝时,通过改变属性值来改变。
package com.atguigu.chapter12.casepak
object CaseClassDemo03 {
def main(args: Array[String]): Unit=(
val amt= new Currency3(3000.0,"RMB")
Val amt2 = amt.copy() 克隆,创建的对象和amt的属性一样println("amt2.value"+ amt2.value +"amt2.unit="+ amt2.unit)println(amt2)
valamt3 = amt.copy(value = 8000.0)
println(amt3)
)
}
abstract class Amount3
case class Dollar3(value: Double) extends Amount3 //样例类caseclass Currency3(value: Double, unit: string) extends Amount3//样例类
case object NoAmount3 extends Amount3 //样例类
二、中置表达式
1.什么是中置表达式?
1+2,这就是一个中置表达式,如果 unapply 方法产出一个元祖,可以在 case 语句中使用中置表达,比如可以匹配一个 List 序列。
2.应用实例
List(1,3,5,9)match(//修改并测试
//1.俩个元素间::叫中置表达式,至少first,second俩个匹配才行
//2.first匹配第一个second匹配第二个,rest匹配剩余部分(5,9)
case first ::second::rest=> printin(first + second + rest length)
Case_=>printin(“匹配不到....”)
首先是一个list的集合,现在用中置表达式match来匹配,按照这个程序进行下去,最后返回时得到一个元组。
运行结果如下:
package com.atguigu.chapter12
object MidCase (
def main(args: Array[String]):Unit =
List(1,3,5,9) match
//修改并测试
//1.两个元素间:叫中置表达式,至少first,second两个匹配才行.
//2.first 匹配第一个 second匹配第二个,rest 匹配剩余部分(5,9)case first ::second ::rest => println(first + second + rest.length)//
case _=> println(”匹配不到...”)
)
)
}
D:\program\jdk8\bin\java
13 2
Processfinished with exit code0