2019.6.3第一次写博客:Scala模式匹配(上)

第一次写博客:Scala模式匹配

#引用尚硅谷韩顺平Scala视频部分内容
第一次写博客,如有浏览,勿喷

模式匹配基本介绍
scala中没有java中的switch语法,但是scala的match类似于java的switch,并且功能更强大。
Scala的模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。如果所有case 都不匹配,那么会执行case_分支,类似于Java中default语句。

下面以一个简单的程序为例:
object MatchDemo01{
def main(args:Aray[String]):Unit={
val oper=’’+"
val n1=20
val n2=10
var res=0
//说明
//1.match(类似java switch)和case是关键字
//2.如果匹配成功,则执行=>后面的代码块.
//3.匹配的顺序是从上到下,匹配到一个就执行对应的代码
//4.=>后面的代码块不要写break,会自动的退出match
//5.如果一个都没有匹配到,则执行case_后面的代码块
oper match{
case’+’=>res=n1+n2
case’’=>res=n1-n2
case’/=>res=n1n2
case"=>res=nl/n2
case _=→println(“oper error”)
println(“res=”+res)

程序执行结果:
执行case "+
使用match的细节及注意事项
1)如果所有case 都不匹配,那么会执行case_分支,类似于Java中default语句2)如果所有case都不匹配,又没有写case_分支,那么会抛出MatchError
3)每个case中,不用break语句,自动中断case
4)可以在match中使用其它类型,而不仅仅是字符5)=>等价于java swtich的:
6)=>后面的代码块到下一个case,是作为一个整体执行,可以使用}扩起来,也可以不扩。

守卫
如果想要表达匹配某个范围的数据,就需要在模式匹配中增加条件守卫。
例如:
object MatchIfDemo01{
def main(args:Aray[String]):Unit={
for(ch<-“±3!”){//是对“±3!”遍历var sign=0
var digit=0
ch match{
case’+’=>sign=1
case’’=>sign=-1
//说明
//如果case后有条件守卫即if,那么这时的不是表示默认匹配
//表示忽略传入的ch case_if ch.toString.equals(“3”)=>digit=3
case_if(ch>1110|ch<120)=>println(“ch>10”)
case_=>sign=2
}
//分析
//+10
//–10
//303//120
println(ch+""+sign+""+digit)
}}}

模式中的变量
如果在case关键字后跟变量名,那么match前表达式的值会赋给那个变量.
实例代码:
object Match Var{
def main(args:Array[String]):Unit={
valch=U"
ch match{
case’+’=>println(“ok-”)
//下面 case mychar含义是mychar=ch case mychar=>println(“ok-”+mychar)
case_=>println(“ok~~”)
val chl=’+’
/match是一个表达式,因此可以有返回值/返回值就是匹配到的代码块的最后一句话的值val res=chl match{
case’+’=>ch1+“hello”
//下面 case mychar 含义是mychar=ch case_=>println(“ok~”)
}
println(“res=”+res)
}

类型匹配
可以匹配对象的任意类型,这样做避免了使用isInstanceOf和asInstanceOf方法
例如:
object MatchTypeDemo01{
def main(args:Array[String]):Unit={
vala=8
//说明obj实例的类型根据a的值来返回val obj=if(a1)1
else if(a
2)“2”
else if(a3)Biglnt(3)
else if(a
4)Map(“aa”->1)else if(a5)Map(1->“aa”)else if(a6)Array(1,2,3)
else if(a7)Array(“aa”,1)
else if(a
8)Array(“aa”)
//说明
//1.根据obj的类型来匹配
//返回值
val result=obj match{
case a:Int=>a case b:Map[String,Int]=>”对象是一个字符串-数字的Map集合”case c:Map[Int,String]=>”对象是一个数字-字符串的Map集合”
case d:Array[String]=>d/"对象是一个字符串数组”
case e:Array[Int]=>“对象是一个数字数组”
case f:BigInt=>Int.MaxValue
case_=>”啥也不是”
println(result)
类型匹配注意事项
1)Map[String,Int]和Map[Int,String]是两种不同的类型,其它类推。
2)在进行类型匹配时,编译器会预先检测是否有可能的匹配,如果没有则报错.
在这里插入图片描述
已被定义为int类型

匹配数组
1)Array(0)匹配只有一个元素且为0的数组。
2)Array(x,y)匹配数组有两个元素,并将两个元素赋值为x和y。当然可以依次类推Array(x,y,z)匹配数组有3个元素的等等…
3)Array(0,*)匹配数组以0开始
匹配列表
例如:
object MatchList{
def main(args: Array[ String]): Unit={
for (list<-Array(List(0), List(1,0), List(88), List(O,0,0), List(1,0,0)){
val result=list match{
case 0:: Nil=>“0”//
casex:y: Nil=>x+""+y//case 0:: tail=>“0…”//
casex:: Nil=>x
case_=>“something else”
}
//1.0
//2.10
//3.0
//4. something else
printin(result)
}
}
}
匹配元组
例如:
object MatchTupleDemoo1{
def main(args:Array[String]):Unit={
/如果要匹配(10,30)这样任意两个元素的对偶元组,应该如何写for(pair <-Array((0,1),(1,0),(10,30),(1,1),(1,0,2)){
val result=pair match{//
case(0,)=>“0…”//
case(y,0)=>y//
case(x,y)=>(y,x)/“匹配到(x,y)”+x+""+y
case=>“other”//.
}
//1.0
//2.1
//3. other//4. other
println(result)
}
}
}

对象匹配等等明天介绍

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值