模式匹配是Scala中非常有特色、非常强大的一种功能,类似子Java中的svitch case语法即对一个值进行条件判断,然后针对不同的条件进行不同的处理。但是Scala的模武匹配的功能比Java中的功能要强大,Java的switch case语法只能对值进行匹配。但是Scala的楼式匹配除了可以对值进行匹配之外,还可以对类型、Array 和List等进行匹配。
模式匹配属于Scala中的高级特性,在Scala中占有非常重要的地位,Scala程序的源代码中存在大量的模式匹配。在Java中,switch具有匹配的作用,但是switch有匹配支持的类型不完善等缺点。Java中的switch只支持byte、short、int、char 和String以及枚举类型的模式匹配。
Scala中模式匹配的语法格式
- Scala的模式数据类型:
Scala的模式匹配数据类型非常丰富,既可以是自定义的类,也可以是Scala本身的类。有Stimg类、变量、常量以及其他复杂类型,其中类表示数据类型。匹配变量时需要结合守卫语句,通过派加守卫语句即条件判断,可以过滤一部分不必要的值。匹配其他复杂类型包括构造器、元组等。匹配响造器时会对构造器的参数和对应类的类型进行匹配。
下面举例说明Scala的模式匹配。
(1)常量。(2)变量。(3)构造器。(4)序列。(5)元组。(6)类型。(7)变量绑定。
例题
Scala
object Test {
def main(args: Array[String]): Unit = {
//身份证号
val id = "33900520202310042"
// val id = "429005202023210042"
// val id = "31900520202310042"
// val id = "11900520202310042"
//截取前两位
val pre = id.substring(0,2).toInt
pre match {
case 42 => println("湖北")
case 11 => println("北京")
case 31 => println("上海")
case _ => println("其他")
//细节1:case _ 的位置 一定要放在最后!!!
//细节2:case _ 不写,如果没有正确的匹配项,报错!
}
//如果是42,输出湖北
//如果是11,输出北京
//如果是31,输出上海
//否则,就输出 其他
//if else if else
// if(pre == 42) {
// println("湖北")
// }else if(pre == 11) {
// println("北京")
// }else if(pre == 31) {
// println("上海")
// }else{
// println("其他")
//
// }
}
}
Scala
object test1 {
def main(args: Array[String]): Unit = {
//从数据库中获得数据 1,2,3,4
// 要显示给用户的是 一等,二等,三等,四等
val level = 1
val levelTxt = level match {
case 1 => "一等"
case 2 => "二等"
case 3 => "三等"
case 4 => "四等"
case _ => "未知"
}
println(s"levelText:${levelTxt}")
}
}
Scala
object test2 {
// match case 匹配元组
def main(args: Array[String]): Unit = {
// val d1 = (1,2,3)
val d1 = (1,2,3,4)
// val d1 = (1,2,3,4,5)
val d: Any = d1 //d的类型是Any
d match {
case (x,y,z) => println(s"这是一个有三个元素的元组,它的第二个元素是:${y}")
case (x,y,z,k) => println(s"这是一个有四个元素的元组,它的最后一个元素是:${y}")
case _ => println("未知类型")
}
}
}
答案:1.B 2. other
Scala
import scala.io.StdIn
object test3 {
def main(args: Array[String]): Unit = {
//从控制态度入一个数字a
val a = StdIn.readInt()
// if(a >= 0 && a <= 3) {println("[0-3]")}
// else if(a >= 4 && a <= 8) {println("[4-8]")}
// else {println("未匹配")}
println(s"用户输入的是:$a")
a match {
case x if x>=0 && x<=3 => println("[0-3]")
case x if x>=4 && x<=8 => println("[4-8]")
case _ => println("未匹配")
}
}
}
判断一个年份是否是闰年代码习题:
Scala
import scala.io.StdIn
object test4 {
def main(args: Array[String]): Unit = {
val year = StdIn.readInt()
println(s"请输入年份:$year")
year match {
case x if (x%400==0) => println(s"$x 是闰年")
case x if (x%4==0 && x%100 != 0) => println(s"$x 是闰年")
case _ => println(s"$year 不是闰年")
}
}
}
Scala
object test5 {
def main(args: Array[String]): Unit = {
val i = 1
val j:Double = 1.2
val b:Boolean = false
val x:Any = b
x match {
case _:Int => println(s"当前是Int")
case _:Double => println(s"当前是Double")
case _:Boolean => println(s"当前是Boolean")
case _ => println("其他")
}
}
}
Scala
object test6 {
def main(args: Array[String]): Unit = {
val arr1 = Array(1,2,3)
val arr2 = Array(0,2,3)
val arr3 = Array(1,2,3,4)
val arr4 = Array(-1,1,2,3,4)
val b:Any = arr3
b match {
case Array(1,x,y) => println(s"数组第一个元素是1,一个有3个元素${x},${y}")
case Array(1,x,y,z) => println("数组第一个元素是1,一个有4个元素")
case Array(_,x,_*) => println("数组第二元素是1,一个有n个元素")
case _ => println("其他")
}
}
}
Scala
object test7 {
case class Person(name:String)
case class Student(name:String,className:String)
//match case 能根据 类名和属性的信息,匹配到相应的类
//注意:
//1.匹配的时候,case class的属性个数要对上
//2.属性名不需要一一对应
def main(args: Array[String]): Unit = {
val p1 = Person("小花")
val s1 = Student("小明","2(3)班")
val a:Any = p1
a match {
case Person(nm) => println("普通人类",nm)
case Student(name,className) => println(className,"的学生",name)
case _ => println("其他")
}
}
}
Scala
object test8 {
//需求:现在有一个数组Array(1,2,3,4),我希望能定义三个变量,他们的值分别是数组中的1,2,3个元素的值
def main(args: Array[String]): Unit = {
val arr = Array(1,2,3,4,5)
// 第一个元素的值:arr(0)
// println(arr(0))
// var x = arr(1)
// var y = arr(2)
// var z = arr(3)
// println(x,y,z)
//有一个更简单的方式
//模式匹配
var Array(_,x,y,z,_*) = arr
println(x)
println(y)
println(z)
}
}
Scala
object test9 {
def main(args: Array[String]): Unit = {
val m1 = Map(
"my - 阿里巴巴" -> 1964,
"mht - 腾讯" -> 1971,
"lyh - 百度" -> 1968,
"lj - 小米" -> 1969,
"dl - 网易" -> 1971,
)
// val t = ["雷总",1969] //元组
// println(t._2)
//找出哪些是1971年的老板?
//对于Map,可以 for 遍历
//模式匹配
for((k,1971) <- m1){
println(k)
}
}
}