matchcase

34 阅读2分钟

match case 的用法

  1. 类似 if-else if 这种多分支选择结构,精确匹配值 (1). case _ 是不可省略的:如果匹配不成功,又没有 case _,程序会报错
    (2). case _ 必须要在最后。

  2. 匹配元组元素的数量

  3. 匹配变量类型

  4. 匹配元素特征

  5. 样例类及其属性

  6. 变量声明中的模式匹配

object matchcase01 {
  def main(args: Array[String]): Unit = {
    println(getProvinceName(11))
    println(getProvinceName(42))
    println(getProvinceName(12))
  }

  def getProvinceName(code: Int): String = {
    code match {
      case 22 => "湖北"
      case 11 => "北京"
      case _ => "未知"
    }
  }
}
object matchcase02 {
  def main(args: Array[String]): Unit = {
    val xiaoming = (100,100,100)
    val xiaohong = (89,98)
    getScore(xiaohong)
    getScore(xiaoming)
    getScore((1,2,3,4))
  }

  def getScore(score:Any):Unit = {
    score match {
      case (a,b,c) => println(s"元组中有三个元素: a = " + a + ",b = " + b + " c = " + c)
      case (a,b) => println(s"元组中有两个元素: a = " + a + ",b = " + b)
      case _ => println("未知")
    }
  }
}
object matchcase03 {
  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("未知")
    }
  }
}
object matchcase04 {
  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(arr: Any): Unit = {
    arr 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("未知")
    }
  }
}
object matchcase05 {
  // 定义一个样例类:圆形。它有一个属性:半径
  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")
  }
}

知识点:守卫 match { case 模式 if 条件 => 执行的事情 }

object matchcase06 {
  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5)

    // 定义三个变量,分别设置初始值为arr的前三个元素的值?
    val a = arr(0)
    val b = arr(1)
    val 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)
  }
}