Scala模式匹配的方法
这篇文章主要介绍“Scala模式匹配的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Scala模式匹配的方法”文章能帮助大家解决问题。
Scala的模式匹配最常用于match语句中。下面是一个简单的整型值的匹配实例。
valcolorNum=1valcolorStr=colorNummatch{case1=>"red"case2=>"green"case3=>"yellow"case_=>"NotAllowed"}println(colorStr)
为了测试上面代码,可以直接把上面代码放入到“/usr/local/scala/mycode/test.scala”文件中,然后,在Linux系统的Shell命令提示符状态下执行下面命令:
scalatest.scala
Shell 命令
另外,在模式匹配的case语句中,还可以使用变量。
valcolorNum=4valcolorStr=colorNummatch{case1=>"red"case2=>"green"case3=>"yellow"caseunexpected=>unexpected+"isNotAllowed"}println(colorStr)
按照前面给出的方法,在test.scala文件中测试执行上述代码后会在屏幕上输出:
4isNotAllowed
也就是说,当colorNum=4时,值4会被传递给unexpected变量。
类型模式Scala可以对表达式的类型进行匹配。
for(elem"Spark","Hadoop",'Hello)){valstr=elemmatch{casei:Int=>i+"isanintvalue."cased:Double=>d+"isadoublevalue."case"Spark"=>"Sparkisfound."cases:String=>s+"isastringvalue."case_=>"Thisisanunexpectedvalue."}println(str)}
在test.scala文件中测试执行上述代码后会在屏幕上输出:
9isanintvalue.12.3isadoublevalue.Sparkisfound.Hadoopisastringvalue.Thisisanunexpectedvalue.“守卫(guard)”语句
可以在模式匹配中添加一些必要的处理逻辑。
for(elemcase_if(elem%2==0)=>println(elem+"iseven.")case_=>println(elem+"isodd.")}}
上面代码中if后面条件表达式的圆括号可以不要。执行上述代码后可以得到以下输出结果:
1isodd.2iseven.3isodd.4iseven.for表达式中的模式
我们之前在介绍“映射”的时候,实际上就已经接触过了for表达式中的模式。 还是以我们之前举过的映射为例子,我们创建的映射如下:
valuniversity=Map("XMU"->"XiamenUniversity","THU"->"TsinghuaUniversity","PKU"->"PekingUniversity")
循环遍历映射的基本格式是:
for((k,v)
对于遍历过程得到的每个值,都会被绑定到k和v两个变量上,也就是说,映射中的“键”被绑定到变量k上,映射中的“值”被绑定到变量v上。
下面给出此前已经介绍过的实例:
for((k,v)printf("Codeis:%sandnameis:%s\n",k,v)
上面代码执行结果如下:
Codeis:XMUandnameis:XiamenUniversityCodeis:THUandnameis:TsinghuaUniversityCodeis:PKUandnameis:PekingUniversitycase类的匹配
case类是一种特殊的类,它们经过优化以被用于模式匹配。
caseclassCar(brand:String,price:Int)valmyBYDCar=newCar("BYD",89000)valmyBMWCar=newCar("BMW",1200000)valmyBenzCar=newCar("Benz",1500000)for(carcaseCar("BYD",89000)=>println("Hello,BYD!")caseCar("BMW",1200000)=>println("Hello,BMW!")caseCar(brand,price)=>println("Brand:"+brand+",Price:"+price+",doyouwantit?")}}
把上述代码放入test.scala文件中,运行“scala test.scala”命令执行后可以得到如下结果:
Hello,BYD!Hello,BMW!Brand:Benz,Price:1500000,doyouwantit?Option类型
标准类库中的Option类型用case类来表示那种可能存在、也可能不存在的值。 一般而言,对于每种语言来说,都会有一个关键字来表示一个对象引用的是“无”,在Java中使用的是null。Scala融合了函数式编程风格,因此,当预计到变量或者函数返回值可能不会引用任何值的时候,建议你使用Option类型。Option类包含一个子类Some,当存在可以被引用的值的时候,就可以使用Some来包含这个值,例如Some(“Hadoop”)。而None则被声明为一个对象,而不是一个类,表示没有值。 下面们给出一个实例。
//首先我们创建一个映射scala>valbooks=Map("hadoop"->5,"spark"->10,"hbase"->7)books:scala.collection.immutable.Map[String,Int]=Map(hadoop->5,spark->10,hbase->7)//下面我们从映射中取出键为"hadoop"对应的值,这个键是存在的,可以取到值,并且取到的值会被包含在Some中返回scala>books.get("hadoop")res0:Option[Int]=Some(5)//下面我们从映射中取出键为"hive"对应的值,这个键是不存在的,所以取到的值是None对象scala>books.get("hive")res1:Option[Int]=None
scala
Option类型还提供了getOrElse方法,这个方法在这个Option是Some的实例时返回对应的值,而在是None的实例时返回传入的参数。例如:
scala>valsales=books.get("hive")sales:Option[Int]=Nonescala>sales.getOrElse("NoSuchBook")res3:Any=NoSuchBookscala>println(sales.getOrElse("NoSuchBook"))NoSuchBook
scala
可以看出,当我们采用getOrElse方法时,如果我们取的”hive”没有对应的值,我们就可以显示我们指定的“No Such Book”,而不是显示None。 在Scala中,使用Option的情形是非常频繁的。在Scala里,经常会用到Option[T]类型,其中的T可以是Sting或Int或其他各种数据类型。Option[T]实际上就是一个容器,我们可以把它看做是一个集合,只不过这个集合中要么只包含一个元素(被包装在Some中返回),要么就不存在元素(返回None)。既然是一个集合,我们当然可以对它使用map、foreach或者filter等方法。比如:
scala>books.get("hive").foreach(println)
scala
可以发现,上述代码执行后,屏幕上什么都没有显示,因为,foreach遍历遇到None的时候,什么也不做,自然不会执行println操作。
关于“Scala模式匹配的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。