模式匹配-基础使用

20 阅读2分钟

任务:

  • 1.定义一个函数,输出省份编号,返回省份的名称 eg: 42 湖北 & 11 北京
package matchcase

object matchcase01 {
 def main(args: Array[String]): Unit = {
   println(getProvinceName(11))  // 输出:北京
   println(getProvinceName(42))  // 输出:湖北
   println(getProvinceName(12))  // 输出:未知
 }

 private def getProvinceName(code: Int): String = {
   code match {
     case 42 => "湖北"   // 统一缩进,规范格式
     case 11 => "北京"
     case _  => "未知"   // case _ 匹配所有未明确指定的情况
   }
 }
}

match case的用法:

  • (1)类似于if else if 这种多分支选择结构,精确匹配值
  • ①.case_是不可省略的,如果匹配不成功,又没有case_,程序会报错
  • ②.case_必须放在最后
  • (2)匹配元组元素的数量
package matchcase

object matchcase02 {
  def main(args: Array[String]): Unit = {
    val xiaohong = (60, 100, 100)
    val xiaoming = (80, 90)
    getScore(xiaohong)
    getScore(xiaoming)
    getScore(1, 2, 3, 4)

    val age:Int = 10
  }

  def getScore(score: Any*): Unit = {
    score match {
      case a :: b :: c :: Nil => println(s"元组中有三个元素: a = ${a}, b = ${b}, c = ${c}")
      case a :: b :: Nil => println(s"元组中有两个元素: a = ${a}, b = ${b}")
      case _ => println("未知")
    }
  }
}

(3).匹配变量类型

package matchcase

object matchcase {
  def main(args: Array[String]): Unit = {
    testType(1)
    testType(1.1)
    testType("1")
  }

  def testType(i: Any): Unit = {
    i match {
      case _: Int => println("你输入的是 Int")
      case _: Boolean => println("你输入的是 Boolean")
      case _ => println("else")
    }
  }

}

(4).匹配元素特征

package matchcase

object matchcase04 {
  object ArrayMatch {
    def main(args: Array[String]): Unit = {
      testType(Array(1, 2, 3, 4))
      testType(Array(1, 2, 3))
      testType(Array(1, 2))
      testType("hello")
    }

    def testType(arr: Any): Unit = {
      arr match {
        case Array(x, y, z, w) => println(s"第一个是${x}, 第二个是${y}, 第三个是${z}, 第四个是${w}")
        case Array(x, y, z) => println(s"第一个是${x}, 第二个是${y}, 第三个是${z}")
        case Array(x, y) => println(s"第一个是${x}, 第二个是${y}")
        case _ => println("其他")
      }
    }
  }
}

(5).样例类及其属性

package matchcase

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(s"圆的面积是: "+ radius * radius*3.14)
      case Rectangle(width, height) => println(s"矩形的面积是:" +width * height)
      case _ => println("未知形状")
    }
  }

  def main(args: Array[String]): Unit = {
    getArea(Circle(2))
    getArea(Rectangle(2, 3))
    getArea("abc")
  }
}

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

package matchcase

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

    // 定义三个变量,分别设置初始值为arr的前三个元素的值
    var a = arr(0)
    var b = arr(1)
    var c = arr(2)
    println("a = "+1+" b =" +b+"c="+c)

    // 使用模式匹配,将arr的前三个元素分别赋值给a,b,c
    val Array(x, y, z, _*) = arr
    // _* 占位,表示至少3个部分赋值给前几个
    println("x = "+x+" y = "+y+" z ="+z)
  }
}