守卫语句的定义:
守卫语句是一个附加在case 语句后的布尔表达式,用于进一步筛选匹配条件。只有当match 的值满足 case 模式并且守卫语句的条件也为真时,该 case 分支才会被执行。
守卫语句的格式:
守卫语句紧跟在case 模式之后,通过 if 关键字引入,格式如下:
Scala
value match{
case pattern if guardCondition => result
//其他 case 语句
}
其中,value 是要进行匹配的值,pattern 是匹配模式,guardCondition 是守卫条件(一个布尔表达式),result 是当该 case 分支匹配成功时返回的结果。
用户输入一个年份,判断是否是闰年:
Scala
import scala.io.StdIn
object Test39 {
def main(args: Array[String]): Unit = {
//从控制台读入一个年份
val year=StdIn.readInt()
// 判断year是闰年
// 1. year能整除4,不能整除100
// 2. year能整除400
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 Test40 {
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 a:Boolean=>println(s"当前是Boolean $a")
case _=>println("其他")
}
}
}
匹配案例:
Scala
object Test42 {
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("其他")
}
}
}
需求:现在有一个数组Array(1,2,3,4),我希望能定义三个变量,它们的值分别是数组中的第1,2,3个元素的值
Scala
object Test42_1{
//需求:现在有一个数组Array(1,2,3,4),我希望能定义三个变量,它们的值分别是数组中的第1,2,3个元素的值
def main(args: Array[String]): Unit = {
val arr=Array(1,2,3,4)
//第一个元素的值: arr(0)
// println(arr(0))
// var x =arr(0)
// var y =arr(1)
// var z =arr(2)
// println(x,y,z)
//有一个更简单的方式
//模式匹配
var Array(x,y,z,_*)=arr
println(x)
println(y)
println(z)
}
}