模式匹配-基础使用

69 阅读3分钟

(一)分析问题并解决

可以根据元组的元素的个数来匹配。

package matchcase

object matchase01 {
  def main(args: Array[String]): Unit = {
//    val code = 42
//    var province = ""
//    if(code == 42){
//      province = "湖北省"
//    }else if (code == 52){
//      province= "四川省"
//    }else{
//      province="未知"
//    }

    val code =12
    val province = code match {
      case 42 => "湖北省"
      case 52 => "四川省"
      case _ => "未知"
    }
    println(province)
  }
}

(二)match case的基本格式

执行流程是:如果value匹配到了pattern1,就执行结果1,如果都没有匹配到,就执行 _ 对应的内容。

package matchcase

object matchase02 {
  def main(args: Array[String]): Unit = {
/*
*1.如果·能精准匹配成功,就会执行后面的代码
* 2.case_它表示可以匹配任意的内容。一定要放在match case的最后一条
* 3.case_不能省略:如果匹配别错过,就会报错。
*  */

//1.从键盘获取数字
    val code =10
//2.使用matchcase进行匹配
    code match {
      case 1 => println("one")
      case 2 => println("two")
      case _ => println("未知")
    }
  }
}

image.png

(三)高阶匹配之元组元素数量

package matchcase
/*
* mathch case
* 1.匹配精确值
* 2.匹配数据类型
* 3.匹配元素的个数
* */
object matchase03 {
  def processValue(value:Any):Unit={}

  def processNum(value:Any):Unit={
    value match {
      case (a,b,c) => println(s"三个元素的元组,第一个元素是${a}")
      case (x,y) =>println("两个元素的元组")
      case _=>println("其他")
    }
  }
  def main(args: Array[String]): Unit = {
//    val obj =10
//    processValue(obj)
    processNum( (1,2) )
    processNum( (1,2,3) )
  }
}

image.png

(四)高阶匹配之变量类型匹配

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

package matchcase

/*
* mathch caseD
* 1.匹配精确值
* 2.匹配数据类型
* 3.匹配元素的个数
* 4.匹配数组元素个数,元素特征
* */
object matchase04 {
  def matchArray(value:Any):Unit={
    value 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)

  }
}

image.png

(五)高阶匹配之匹配元素特征

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

package matchcase

/*
* mathch case
* 1.匹配精确值
* 2.匹配数据类型
* 3.匹配元素的个数
* 4.匹配数组元素个数,元素特征
* 5.匹配案例类
* */
object matchase05 {
  case class Circle(r:Double)
  case class Rectangle(w:Double,h:Double)
  def calculateArea(shape:Any):Unit={
    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))
  }
}

(六)高阶匹配之匹配案例类

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

例如格式 对象 match {

case 样例类类型1(字段1,字段2)=> 表达式

case 样例类类型2(字段1,字段2,字段3)=> 表达式

case _ => 其他 } 注意:样例类1中的字段个数要与之对应。

package matchcase

/*
* mathch case
* 1.匹配精确值
* 2.匹配数据类型
* 3.匹配元素的个数
* 4.匹配数组元素个数,元素特征
* 5.匹配案例类
* 6.变量声明
* */
object matchase06 {
  def main(args: Array[String]): Unit = {
    val arr = Array(11,22,33,4,5)
   //定义三个变量:x,y,z保存数组中的前三个元素的值
    val Array(x,y,z,_*)=arr
    println(x,y,z)
  }
}

image.png