版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——第4课Scala模式匹配类型系统完全精通与Spark源码阅读
Scala模式匹配Scala类型系统Spark源码阅读
(文档来源:SparkIMF)
获取更多大数据Spark相关资料,请关注公众微信号:DT_Spark
Scala模式匹配、类型系统完全精通与Spark源码阅读
一:守护
varch=‘+’
chmatch{
case'+'=sign=1
case'-'=sign=-1
case_ifCharacter.isDigit(ch)=digit=Character.digit(ch,10)
case_=sign=0
}
二:模式中的变量
假使在case关键字后跟着一个变量名,那么匹配的表达式会被赋值给那个变量。case_是这个特性的一个特别状况,变量名是_。
Hello,worldforeach{c=println(
cmatch{
case''=space
casech=Char:+c
}
)}
三:类型模式
相比使用isInstanceOf来判断类型,使用模式匹配更好
objmatch{
casex:Int=x
cases:String=Integer.parseInt(s)
case_:BigInt=Int.MaxValue
case_=0
}
捕获异常:
valfile=newFile(fileName)
try{
Scala模式匹配Scala类型系统Spark源码阅读
Source.fromFile(file).getLines()
}catch{
casee1:FileNotFoundException=println(FileNotFoundException)
casee2:RuntimeException=println(RuntimeException)
casee3:Exception=println(Exception)
}
由于匹配是发生在运行期的,而且JVM中泛型的类型信息会被擦掉,因此不能使用类型来匹配特定的Map类型
四:匹配数组、列表和元组
1)数组
valarr=Array(0,3,4,5,6,7)
arrmatch{
caseArray(0)=0
caseArray(x,y)=x++y
caseArray(0,x@_*)=println(x)
case_=somethingelse
}
2)列表
valarr=List(0,4,5,6,7,)
arrmatch{
caseList(0)=0
caseList(x,y)=x++y
caseList(0,x@_*)=println(x)
case_=somethingelse
}
或者
arrmatch{
case0::Nil=0
casex::y::Nil=x++y
case0::tail=0...
case_=somethingelse
}
五:提取器
模式匹配来对数组、列表和元组进行了匹配,在这个过程的背后的是提取器(extractor)机制。使用unapply来提取固定数量的对象,使用unapplySeq来提取一个序列。在前面的代码caseArray(0,x)=...中,Array(0,x)部分实际上是使用了伴生对象中的提取器,实际调用形式是:Array.unapplySeq(arr)。根据Doc,提取器方法接受一个Array参数,返回一个Option。
1)正则表达式是另一个适用提取器的场景。正则有分组时,可以用提取器来匹配分组
valpattern=([0-9]+)([a-z]+).r
99bottlesmatch{casepattern(num,item)=(num,item)}
Scala模式匹配Scala类型系统Spark源码阅读
2)自定义提取器;下面的例子显示电子邮件地址的提取器对象:
objectTest{
defmain(args:Array[String]){
println(Applymethod:+apply(Zara,));
println(Unapplymethod:+unapply(Zara@));
println(Unapplymethod:+unapply(ZaraAli));
}
//Theinjectionmethod(optional)
defapply(user:String,domain:String)={
user+@+domain
}
//Theextractionmethod(mandatory)
defunapply(str:String):Option[(String,String)]={
valparts=strsplit@
if(parts.length==2){
Some(parts(0),parts(1))
}else{
None
}
}
}
六:变量声明中的模式
val(x,y)=(1,2)
val(q,r)=BigInt(10)/%3//返回商和余数的对偶
valArray(first,second,_*)=arr//将第一和其次个分别给first和second
七:for表达式中的模式
importscala.collection.JavaCpertiesAsScalaMap
for((k,v)-System.getProperties())//这里使用了模式
println(k+-+v)
for((k,)-System.getProperties())//失败的匹配会被忽略,所以只打印出值为空的键
println(k)
八:样例类
abstractclassAmount
//继承了普通类的两个样例类
caseclassDollar(value:Double)extendsAmount
caseclassCurrency(value:Double,unit:String)extendsAmount
//样例对象
caseobjectNothingextendsAmount
amtmatch{
caseDollar(v)=$+v
Scala模式匹配Scala类型系统Spark源码阅读
caseCurrency(_,u)=Ohnoes,Igot+u
caseNothing=//样例对象没有()
}
在声明样例类时,下面的过程自动发生了:
构造器的每个参数都成为val,除非显式被声明为var,但是并不推荐这么做;
在伴生对象中提供了apply方法,所以可以不使用new关键字就可构建对象;
提供unapply方法使模式匹配可以工作;
生成toString、equals、hashCode和copy方法,除非显示给出这些方法的定义。
除了上述之外,样例类和其他类型完全一样,方法字段等。
九:匹配嵌套结构
abstarctclassItem
caseclassArticle(description:String,price:Double)extendsItem
caseclassBundle(description:String,price:Double,items:Item*)extendsItem
Bundle(Father'sdayspecial,20.0,
Article(ScalafortheImpatient,39.95),
Bundle(AnchorDistillerySampler,10.0,
Article(OldPotreroStraightRyeWhisky,79.95),
Article(JuniperoGin,32.95)
)
)
模式可以匹配到特定的嵌套:
caseBundle(_,_,Article(descr,_),_*)=descr
十:密封类
当使用样例类来做模式匹配时,假使要让编译器确保已经列出所有可能的选择,可以将样例类的通用超类声明为sealed。密封类的所有子类都必需在与该密封类一致的文件中定义。假使某个类是密封的,那么在编译期所有的子类是可知的,因而可以检查模式语句的完整性。让所有同一组的样例类都扩展某个密封的类或特质是个好的做法。
sealedabstractclassTrafficLightColor
caseobjectRedextendsTrafficLightColor
caseobjectYellowextendsTrafficLightColor
caseobjectGreenextendsTrafficLightColor
colormatch{
caseRed=stop
caseYellow=hurryup
caseGreen=go
}
十一:Option类型
Option类型用来表示可能存在也可能不存在的值。样例子类Some包装了某个值,而样例对象None表示没有值。Option支持泛型。
Scala模式匹配Scala类型系统Spark源码阅读
valmap=Map(3-“a〞,4-“b〞)
map.get(3)match{
caseSome(x)=x
caseNome
}
十二:偏函数
被包在花括号内的一组case语句是一个偏函数。
偏函数是一个并非对所有输入值都有定义的函数,是PartialFunction[A,B]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 买方采购合同范例
- 小吃餐饮商标转让合同范例
- 修路建设施工合同范例
- 土地分成协议合同模板
- 山姆会员合同范例
- 建筑焊接施工合同范例
- 法律变革研究模板
- 另类雇佣童工合同范例
- 关于地合同范例
- 审计局年终工作总结
- 安徽省合肥市第五十中学西校区2024-2025学年期中考试七年级数学试题(无答案)
- 湖北省恩施市沙地初中2024-2025学年八年级数学上学期期中考试题卷(含答案)
- 国开2024年秋《大数据技术概论》形考作业1-4答案
- 旅游景区旅游安全风险评估报告
- 部编2024版历史七年级上册第三单元《第14课 丝绸之路的开通与经营西域》说课稿
- 合同模板 交税
- 期中测试卷(试题)2024-2025学年苏教版数学六年级上册
- 人音版音乐三年级上册全册教案
- 2024年新人教版四年级数学上册《第5单元第1课时 平行与垂直》教学课件
- 期中易错卷(第1-4单元)(试题)-2024-2025学年三年级上册数学人教版
- 【人教版】《劳动教育》五上 劳动项目三《制作扇子》 课件
评论
0/150
提交评论