Scala模式匹配(match)使用

时间:2022-05-17 05:49:45

Scala模式匹配机制,有点类似java中switch语句,应用很广泛,一个模式匹配包含一系列的被选项,每一个选项通过case关键字开始,每个备选项都包含了一个模式及一到多个表达式,中间通过箭头隔开:

  • 下面是一个简单的例子,switch功能:
object ShawnTest {
def main(args: Array[String]) {
val a="red"
a match {
case "red"=>
println("stop")
case "green"=>
println("go")
case "yellow"=>
println("wait")
case _=>
println("unknown sign")
}
}
}
执行结果为 stop

可以直接进行值的的赋值

 def test(): Unit ={
val sign="black"
val action=sign match {
case "red"=>"stop"
case "green"=>"go"
case "yellow"=>"wait"
case _=>"unknown sign"
}
println(action)
}
调用test()执行结果的为unknown sign
  • 如果没有哪个模式能匹配上,则会抛出MatchError异常,而解决这个方法就是这是默认模式,即类似switch中default,在这里使用”case_”来避免;
  • 类型模式匹配:除了能对值进行等值匹配,还可以对变量或表达式进行类型匹配,做类型的匹配的话必须给出一个变量名,如示例中的xyz
 def main(args: Array[String]) {
test3("fff")
}
def test3(obj:Any){
obj match {
case x:Int => println("obj is int")
case y:String => println("obj is string")
case z:Float => println("obj is float")
case _=>println("obj is an other type")
}
}
结果输出为 obj is string

在scala中还可以通过isInstanceOf来进行类型匹配判断如

if(obj.isInstanceOf[String]){
}

不过在实际引用中更倾向于使用模式匹配,因为在模式匹配中当匹配到对应的类型时值就会当作对应的类型如上面的obj在匹配到String会将值当作string绑定到y,如果通过isInstanceOf判断话还需要asInstanceOf做类型转换后才操作

  • 样例类:样例类是一种特殊的类,是经过优化以用于模式匹配
/**
* Created by Shawn on 2017/7/23.
*/

case class Person(val name:String,val age:Int)
case class Car(val name:String,val price:Int)

在声明样例类时,会自动在伴生对象中提供了apply方法,这样就可以不使用new关键字就可直接构建对象;

val p1=Person("shawn",22)