val oper: Char = '+' val n1: Int = 20 val n2: Int = 10 var res: Int = 0
oper match { case '+' => res = n1 + n2 case '-' => res = n1 - n2 case '*' => res = n1 * n2 case '/' => res = n1 / n2 case _ => println("oper error") }
println("res:\t" + res)
说明:
1. match 和 case 是 scala 中模式匹配的关键字
1. 如果匹配成功,执行 => 后的代码块
1. 匹配顺序是从上到下的,匹配到就执行对应的代码
1. => 还没的代码块不需要写 break ,会自动退出 match
1. 如果都没有匹配到,则会执行 case _ 后的代码
条件守卫
如果想要表达匹配某个范围的数据,就需要在模式匹配中增加条件守卫
1 2 3 4 5 6 7
val flag: String = "mysql"
flag match { case _ if flag.equals("mysql") => println("mysql") case _ if flag.equals("kafka") => println("kafka") case _ if flag.equals("redis") => println("redis") }
模式变量
如果在 case 关键字后跟变量,那么 match 表达式的值会赋给那个变量
1 2 3 4 5 6 7 8
val flag: String = "kafka"
flag match { case value => println("value:" + value) case _ if flag.equals("mysql") => println("mysql") case _ if flag.equals("kafka") => println("kafka") case _ if flag.equals("redis") => println("redis") }
模式匹配返回值
在模式匹配中,match 是一个表达式,因此可以拥有返回值
1 2 3 4 5 6 7
val flag: String = "kafka"
val res: String = flag match { case _ if flag.equals("mysql") => "mysql" case _ if flag.equals("kafka") => "kafka" case _ if flag.equals("redis") => "redis" }
类型匹配
可以匹配对象任意类型,避免使用 isInstanceOf 和 asInstanceOf 方法
1 2 3 4 5 6 7 8
val obj: Any = ""
obj match { case int: Int => println("Int") case string: String => println("String") case map: Map[String,String] => println("Map[String,String]") ... }
注意:
1. `Map[String,String]` 和 `Map[String,Int]`是两种不同类型
2. 在进行类型匹配时,编译器会`预先检测是否有可能的匹配`,如果没有则会报错
3. `case int: Int => println("Int")`表示将 `int=obj`,然后再判断类型
4. 如果`case _`出现在 match 中间,则表示隐藏变量名,而`不是表示默认匹配`
1 2 3 4 5 6 7
val obj: Any = ""
obj match { case _: Int => println("Int") case _: String => println("String") case _: Map[String,String] => println("Map[String,String]") }
匹配数组
Array(0)只匹配一个元素且为 0 的数组
Array(x,y)匹配数组有两个元素,并将两个元素赋值为 x 和 y。可以依次类推Array(x,y,z)...
for (arr <- array) { val res: String = arr match { caseArray(0) => "0" caseArray(x, y) => x + "-" + y caseArray(0, _*) => "以 0 开头的数组" case _ => "什么数组都不是" } println("res = " + res) }
匹配列表
1 2 3 4 5 6 7 8 9 10
val array: Array[List[Int]] = Array(List(0), List(1, 0), List(0, 0, 0), List(1, 0, 0)) for (list <- array) { val res: String = list match { case0 :: Nil => "0" case x :: y :: Nil => x + "-" + y case0 :: tail => "0..." case _ => "SomeThings else" } println("res = " + res) }
元组匹配
1 2 3 4 5 6 7 8 9
val array: Array[Product] = Array((0, 1), (1, 0), (1, 1), (1, 0, 2)) for (pair <- array) { val res: Any = pair match { case (0, _) => "0..." case (x, _) => x case _ => "others" } println(res) }
对象匹配
case 中对象的unapply方法(提取器)返回 some 集合则为匹配成功
返回 none 集合则为匹配失败
1 2 3 4 5 6 7 8 9 10 11
val number: Double = 36.0 number match { caseSquare(n) => println(n) case _ => println("nothing matched") }