# 模式匹配-基础使用和match(case)用法

14 阅读2分钟

模式匹配-基础使用和match(case)用法

编写一个函数,输入省份编号,返回省份的名称

image.png

match(case)的用法

  • (1)类似于 if else if 这种多分支选择结构,精确匹配值
  • case _ 是不可省略的,如果匹配不成功,又没有case _,程序会报错
  • case _必须要放在最后。
  • (2)匹配元组元素的数量
  • (3)匹配变量类型
  • (4)匹配元素特征
  • (5)样例类
  • (6)变量声明中的模式匹配
  • 知识点: 守卫
  •            value match{
                 case 模式 if 条件 => 执行的事情}
    
(2)匹配元组元素的数量
编写一个函数,传入一个元组,其中元素个数并不相同
def main(args: Array[String]): Unit = {
  val xiaohong = (100, 100, 100)
  val xiaoming = (89, 98)

  getScore(xiaohong)
  getScore(xiaoming)
  getScore((1,2,3,4))
}

def getScore(score: Any): Unit = {
  score match {
    case (a,b,c) => println("元组中有三个元素:a= " + a + ",b=" + b + " c= " + c)
    case (a,b) => println("元组中有两个元素:a= " + a + ",b=" + b)
    case _ => println("元组中元素个数未知")
  }
}
(3)匹配变量类型
def main(args: Array[String]): Unit = {
  testType(1)
  testType(1.1)
  testType("1")
}
def testType(i:Any):Unit = {
  i match {
    case x:Int => println("Int")
    case x:Double => println("Double")
    case _ => println("未知类型")
  }
}
(4)匹配元素特征
def main(args: Array[String]): Unit = {
  testType(Array(1,2,3))
  testType(Array(1,2,3,4))
  testType(Array(11,2,3,4))
  testType(Array(11,1,3,4))
}
def testType(i:Any):Unit = {
  i match {
    case Array(1,x,y) => println("arr是一个数组,有三个元素,第一个是1")
    case Array(1,x,y,z) => println("arr是一个数组,有四个元素,第一个是1")
    case Array(x,1,y,z) => println("arr是一个数组,有四个元素,第二个是1")
    case _ => println("未知")
  }
}
(5)样例类
  def main(args: Array[String]): Unit = {
//    定义一个样例类:圆形。它有一个属性:半径
    case class Circle(radius:Double)
//    定义一个样例类:矩形。它有两个属性:长和宽
    case class Rectangle(width:Double,height:Double)
//    定义一个方法,用来求圆形,矩形的面积
    def getArea(obj: Any): Unit = {
      obj match {
        case Circle(radius) => println("圆形的面积是:" + radius * radius * 3.14)
        case Rectangle(width,height) => println("矩形的面积是:" + width * height)
        case _ => println("未知")
      }
    }

    def main(args: Array[String]): Unit = {
      getArea(Circle(2))
      getArea(Rectangle(2,3))
      getArea("abc")
    }
  }
(6)变量声明中的模式匹配
  def main(args: Array[String]): Unit = {
    val arr = Array(1, 2, 3, 4)
//    定义三个变量,分别设置初始值为arr的前三个元素的值?
    var a = arr(0)
    var b = arr(1)
    var c = arr(2)
    println("a = " + a + " b = " + b + " c = " + c)

//    使用模式匹配,将arr的前三个元素分别赋值给a,b,c
    val Array(x,y,z,_*) = arr
//    _* 占位符,表示多的部分放在这
    println("x = " + x + " y = " + y + " z = " + z)
  }
知识点:守卫
    value match{
       case 模式 if 条件 => 执行的事情
}
def main(args: Array[String]): Unit = {
  val a = 1
  a match {
    case x: Int if a > 10 => println("a是10的Int")
    case _ => println("a is not Int")
  }
}