模式匹配-基础使用(2)

22 阅读2分钟

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

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

格式如下:

对象名 match {

    case 变量名1:类型1  => 表达式1  
    case 变量名2:类型2  => 表达式2  
    case 变量名3:类型3  => 表达式3

    // 其他case语句...  
    casee _ => 表达式

}

代码如下:

package matchcase

object case04 {
  /*

  match case 高阶匹配
  1. 匹配元祖不同元素的数量
  2. 匹配数组特殊值
  3.匹配变量的类型
  *
  a:Int = 1;
   **/

  def matchType(value:Any): Unit = {
    value match {
      case x:Int => println(s"${x} 是Int")
      case x:Double => println(s"${x} 是Double")
      case _ => println("未知")
    }

  }

  def main(args: Array[String]): Unit = {

    matchType(1)
    matchType(1.1)
  }



}

结果如下:

image.png

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

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

对象 match {

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

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

case _ => 其他

代码如下:

package matchcase

object case05 {
  /*

  match case 高阶匹配
  1. 匹配元祖不同元素的数量
  2. 匹配数组特殊值
  3.匹配变量的类型
  4.匹配样例类(属性值)
   **/

  // 1. 图形类
  case class Circle(radius: Double) {}
  // 2. 矩形类
  case class Rectangle(width: Double, height: Double) {}

  // 封装一个求面积的方法
  def getArea(shape: Any): Double = {
    shape match {
      case Circle(radius) => math.Pi * radius * radius
      case Rectangle(width, height) => width * height
      case _ => 0.0
    }
  }

  def main(args: Array[String]): Unit = {
    // 1. 实例化圆形对象
    val circle = Circle(2.0)
    // 2. 实例化矩形对象
    val rectangle = Rectangle(2.0, 3.0)
    // 3. 调用求面积方法
    println(getArea(circle))
    println(getArea(rectangle))
  }
}

image.png

(六)匹配for表达式

从Map中打印所有年龄为1983的创业者的信息

package matchcase

object case06 {
  // 1. for循环中,遍历Map
  def main(args: Array[String]): Unit = {
    val m1 = Map(
      "马云 - 阿里巴巴" -> 1964,
      "张一鸣 - 字节跳动" -> 1983,
      "刘强东 - 京东" -> 1974,
      "程维- 滴滴" -> 1983,
    )
    // 请在这个map中,找出所有1983年出生的企业家
    for ((key, 1983) <- m1) {
      println(key)
    }

    for ((key, value) <- m1) {
      if (value == 1983)
        println(key)
    }

    m1.foreach {
      case (key, value) => {
        if (value == 1983)
          println(key)
      }
    }
  }
}

image.png

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

现在有一个数组Array(11, 22, 33, 4, 5, 6),我希望能定义三个变量,它们的值分别是数组中的第1,2,3个元素的值。

代码如下:

package matchcase

object case07 {
  def main(args: Array[String]): Unit = {
    // 定义一个数组,其中有4个元素
    val arr = Array(11, 22, 33, 4, 5, 6)

    // 需求:补充定义三个变量:x,y,z,分别保持数组arr中的第1,2,3-
//    var x = arr(0)
//    var y = arr(1)
//    var z = arr(2)
//
//    println("x=" + x + ",y=" + y + ",z=" + z)

    // 优化:使用match case表达式,完成上述需求
    val Array(x, y, z, _*) = arr

    println("x=" + x + ",y=" + y + ",z=" + z)
  }
}

结果如下:

image.png