模式匹配(高阶使用)

18 阅读3分钟

(一)、守卫语句的定义

守卫语句是一个附加在case语句后的布尔表达式,用于进一步筛选匹配条件。只 有当match的值满足case模式并且守卫语句的条件也为真时,该case分支才会 被执行。

(二)、守卫语句的格式

守卫语句紧跟在case模式之后,通过if关键字引入

其中,value是要进行匹配的值,pattern是匹配模式,guardCondition是守卫条件(一个布尔表达式),result是当该case分支匹配成功时返回的结果。

(三)、高阶匹配之变量类型匹配

除了格式匹配之后,还可以对变量的类型进行匹配。

如果变量名没有被使用到,可以使用_代替。 例如: _:Int =>

需求:
1.定义一个变量为Any类型,然后分别给它赋值不同的类型的数据。

2.对这个变量做模式匹配

(四)、高阶匹配之匹配数组

模式匹配还可以根据数组元素的个数,元素的特征来匹配。

 
/**
 * match case
 * 1.匹配精确值
 * 2.匹配数据类型
 * 3.匹配元素的个数
 * 4.匹配数组元素个数,元素特征
 */

object matchcase04 {

  def matchArray(arr:Any):Unit = {
    arr match {
      case Array(x, y) => println("匹配到有两个元素的数组", x, y)
      case Array(1,b,c) => println("匹配到有三个元素的数组,第一个元素是1")
      case Array(a,b,c) => println("匹配到有三个元素的数组",a,b,c)
      case Array(10,_*) => println("第一个元素是10,元素的个数有任意个")
      case _ => println("没有匹配到")
    }
  }
  def main(args: Array[String]): Unit = {
    val arr1 = Array(1,2,3)
    val arr2 = Array(2,2,3)
    val arr3 = Array(10,2,3,1)
    matchArray(arr1)
    matchArray(arr2)
    matchArray(arr3)
  }
}

(五)、高阶匹配之匹配案例类

模式匹配还根据案例类的不同,匹配不同的案例类和其中的字段信息。


import scala.collection.StepperShape.{ReferenceShape, Shape}

/**
 * match case
 * 1.匹配精确值
 * 2.匹配数据类型
 * 3.匹配元素的个数
 * 4.匹配数组元素个数,元素特征
 * 5.匹配案例类
 */

object matchcase05 {
  case class Circle(r: Double)
  case class Rectangle(w: Double,h: Double)

  def calculateArea(shape:Any):Double = {
    shape match {
      case Circle(r) => 3.14 * r * r
      case Rectangle(w,h) => w * h
      case _ => 0.0
    }
  }
  def main(args: Array[String]): Unit = {
    val circle = Circle(2.0)
    val rectangle = Rectangle(2.0,3.0)
    println(calculateArea(circle))
    println(calculateArea(rectangle))
  }
}

当传入Circle类型时,匹配case Circle(r)并按照圆的面积公式计算;当传入Rectangle类型时,匹配case Rectangle(w, h)并按照矩形面积公式计算。

(六)、变量声明中的模式匹配

 
/**
 * match case
 * 1.匹配精确值
 * 2.匹配数据类型
 * 3.匹配元素的个数
 * 4.匹配数组元素个数,元素特征
 * 5.匹配案例类
 * 6.变量声明时的匹配
 */

object matchcase06 {
  def main(args: Array[String]): Unit = {
    val arr = Array(11,22,33,4,5)
    //定义3个变量:x,y,z保存数组中的前三个元素的值
    //  val x = arr(0)
    //  val y = arr(1)
    //  val z = arr(2)
    val Array(x,y,z,_*) = arr
    println(x,y,z)
  }
}

其中: _*表示多个其他的元素值。