一、基本语法
Scala中的match case语句可以用来匹配各种数据类型,包括基本数据类型、对象、集合等。其基本语法如下:
x match { case pattern1 => result1 case pattern2 => result2 case pattern3 => result3 ... }
其中,x表示要匹配的数据,pattern1、pattern2、pattern3等表示不同的模式,result1、result2、result3等表示每个模式匹配成功后的执行结果。
下面的示例展示了如何在Scala中使用match case语句匹配不同的数据类型:
val x = 5 x match { case 1 => println("one") case 2 => println("two") case 3 | 4 => println("three or four") case _ => println("others") } val y: Any = "Hello World" y match { case s: String => println(s"String: $s") case i: Int => println(s"Int: $i") case d: Double => println(s"Double: $d") case cd: List[_] => println(s"List: $cd") case _ => println("others") }
第一个例子中,如果x等于1,则输出“one”,如果x等于2,则输出“two”,如果x等于3或4,则输出“three or four”,否则输出“others”。
第二个例子中,如果y是一个String类型,则输出它的值,如果y是一个Int类型,则输出它的值,如果y是一个Double类型,则输出它的值,如果y是一个List类型,则输出它的值,否则输出“others”。
二、类型匹配
在Scala中,可以使用类型匹配来判断一个数据的类型。类型匹配可以使用模式匹配和isInstanceOf和asInstanceOf两种方式实现。
使用模式匹配进行类型匹配的示例如下:
val x: Any = "Hello World" x match { case s: String => println(s"String: $s") case i: Int => println(s"Int: $i") case d: Double => println(s"Double: $d") case cd: List[_] => println(s"List: $cd") case _ => println("others") }
使用isInstanceOf和asInstanceOf进行类型匹配的示例如下:
val x: Any = "Hello World" if (x.isInstanceOf[String]) { val s = x.asInstanceOf[String] println(s"String: $s") } else if (x.isInstanceOf[Int]) { val i = x.asInstanceOf[Int] println(s"Int: $i") } else if (x.isInstanceOf[Double]) { val d = x.asInstanceOf[Double] println(s"Double: $d") } else if (x.isInstanceOf[List[_]]) { val cd = x.asInstanceOf[List[_]] println(s"List: $cd") } else { println("others") }
以上两种方式的输出结果是相同的。
三、常量匹配
常量匹配就是匹配一个确定的常量值。在Scala中,常量匹配可以使用文字常量或者枚举类型。
使用文字常量进行常量匹配的示例如下:
val x = 5 x match { case 1 => println("one") case 2 => println("two") case 3 | 4 => println("three or four") case _ => println("others") }
使用枚举类型进行常量匹配的示例如下:
object Fruit extends Enumeration { type Fruit = Value val APPLE, BANANA, ORANGE = Value } import Fruit._ val fruit = APPLE fruit match { case APPLE => println("apple") case BANANA => println("banana") case ORANGE => println("orange") }
以上代码展示了如何在Scala中定义和使用枚举类型。Fruit是一个枚举对象,其中定义了三个值:APPLE、BANANA和ORANGE。下面的代码定义了一个fruit变量,并将它的值设置为APPLE。在匹配fruit变量时,如果它的值是APPLE,则输出“apple”,如果它的值是BANANA,则输出“banana”,如果它的值是ORANGE,则输出“orange”。
四、模式中的变量
在Scala中,在匹配模式时可以使用变量。使用变量可以捕获一部分匹配中的值,并在后续的操作中使用。
在match case语句中使用变量的示例如下:
val x = List(1, 2, 3) x match { case List(1, a, _*) => println(s"a: $a") case _ => println("others") }
以上代码中,使用List(1, a, _*)模式匹配x变量。其中,下划线表示匹配任何值,*表示匹配任意数量的元素。如果x是一个以1开头的List对象,则将第二个元素的值赋值给变量a,并输出a的值。
五、守卫条件
Scala中的守卫条件可以用来增加额外的判断条件,以便更准确地匹配模式。守卫条件放在匹配模式之后,使用if语句进行判断。
下面的示例演示了如何在Scala中使用守卫条件:
val x = List(1, 2, 3) x match { case List(a, b, c) if a + b + c == 6 => println("sum is 6") case List(a, b, c) if a + b + c == 7 => println("sum is 7") case List(a, b, c) => println(s"sum is ${a + b + c}") case _ => println("others") }
以上代码中,匹配了一个List类型的对象,并使用守卫条件判断列表中元素的和。如果列表中元素的和是6,则输出“sum is 6”,如果列表中元素的和是7,则输出“sum is 7”,否则输出“sum is 累加和”的值。