模式匹配
Scala中的模式匹配类似于Java中的switch语法。
但是Scala从语法中补充了更多的功能,所以更加强大
基本语法
模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。如果所有case都不匹配,那么会执行case_分支,类似于Java 中default语句。
package chapter08
object Test01_PatternMatchBase {
def main(args: Array[String]): Unit = {
// 基本定义语法
val x: Int = 2
val y:String = x match {
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "zero"
}
println(y)
// 实例:用模式匹配实现简单的二元运算
val a=25
val b=13
def matchDualOp(op: Char): Any = op match {
case '+' => a+b
case '-' => a-b
case '*' => a*b
case '/' => a/b
case _ => "非法运算符"
}
println(matchDualOp('+'))
println(matchDualOp('*'))
println(matchDualOp(';'))
}
}
- 如果所有case都不匹配,那么会执行case _ 分支,类似于Java中的default语句。若此时没有case _ 分支,那么会抛出MatchError
- 每个case中,不需要使用break语句,自动中断case
- match case 语句可以匹配任何类型,而不只是字面量(常量)
-
=>
后面的代码块,直到下一个case语句之前的代码是作为一个整体执行,可以使用{}
括起来,也可以不括。
模式守卫
如果想要匹配某个范围的数据,就需要在模式匹配中增加条件守卫。
package chapter08
object Test01_PatternMatchBase {
def main(args: Array[String]): Unit = {
// 模式守卫
// 求一个整数的绝对值
def abs(num: Int): Int = {
num match {
case i if i >= 0 => i
case i if i < 0 => -i
}
}
}
}
模式匹配类型
匹配常量
Scala中,模式匹配可以匹配所有的字面量,包括字符串,字符,数字,布尔值等等。
匹配类型
List存在泛型擦除,不管case List的泛型是什么,定义的任何List类型列表都可以与之匹配