scala的模式匹配有点类似于java里面的switch,不过比java的switch更加简洁强大
一,简单匹配
一个简单例子:
def main(args: Array[String]): Unit = {
val inPut = 0
inPut match {
case 0 => println("匹配值为0")
case 1 => println("匹配值为1")
}
}
这个例子和java中的switch类似如果把inPut值改为3,会抛出MatchError
下面以一个例子来说明match的语法特性
def main(args: Array[String]): Unit = {
for{
x <- Seq(1,2,2.7,"one","two",'four)
}{
val str = x match {
case 1 => "int 1"
case _:Int => "other int:"+x
case _:Double =>"a double :"+x
case "one" => "string one"
case _:String =>"other string:"+x
case _ =>"unexpected value"+x
}
println(str)
}
}
// 执行结果
// int 1
// other int:2
// a double :2.7
// string one
// other string:two
// unexpected valueSymbol(four)
由于X是ANY类型,所以必须有个匹配下限可以保证不抛出MatchError
下面再举一个例子来说明变量匹配中一个值得注意的地方
def main(args: Array[String]): Unit = {
def checkY(y:Int): Unit ={
for {
x <- Seq(99, 100, 101)
} {
val str = x match {
case y => "found y!"
case i: Int => "int: "+i
}
println(str)
}
}
checkY(100)
}
// 执行结果
// found y!
// found y!
// found y!
在这个例子中,我们预期得到的结果是
int: 99
found y!
int: 101
但是程序的执行结果和我们预期不符,为什么?
case y在这个例子里面的意思是,匹配任意输入的意思,如果我们想用case y去匹配变量,那么需要在y上面加上反引号
在case中,小写字母代表的是待提取的变量,加上反引号才代表引用的之前的值,如果大写字母代表的是类型