第4课Scala模式匹配类型系统完全精通与Spark源码阅读_第1页
第4课Scala模式匹配类型系统完全精通与Spark源码阅读_第2页
第4课Scala模式匹配类型系统完全精通与Spark源码阅读_第3页
第4课Scala模式匹配类型系统完全精通与Spark源码阅读_第4页
第4课Scala模式匹配类型系统完全精通与Spark源码阅读_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论