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

17 阅读3分钟

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

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

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)

  }
}

如果变量名没有被使用到,可以使用_代替。 例如: _:Int =>

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

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

对象 match {

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

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

case _ => 其他

}

注意:样例类1中的字段个数要与之对应。

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)

    println(getArea(circle))
    println(getArea(rectangle))
  }
}

(六)匹配for表达式

方式1:使用 for + if守卫

方式2:使用模式匹配

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

package matchcase

object case06 {
  def main(args: Array[String]): Unit = {
    val m1 = Map(
      "马云" -> "阿里巴巴" -> 1964,
      "马化腾" -> "腾讯" -> 1971,
      "李彦宏" -> "百度" -> 1968,
      "雷军" -> "小米" -> 1969,
      "丁磊" -> "网易" -> 1971,
      "张一鸣" -> "字节跳动" -> 1983,
      "刘强东" -> "京东" -> 1974,
      "程维" -> "滴滴" -> 1983,
      "王兴" -> "美团" -> 1979,
      "周鸿祎" -> "360" -> 1970,
      "黄峥" -> "拼多多" -> 1980,
      "李想" -> "理想汽车" -> 1981,
      "何小鹏" -> "小鹏汽车" -> 1977,
      "贾跃亭" -> "乐视" -> 1973,
      "陈天桥" -> "盛大网络" -> 1973,
      "周源" -> "知乎" -> 1980,
      "王小川" -> "搜狗" -> 1978
    )

    // 请在这个Map中,找出所有1983年出生的企业家
    for((key,1983) <- m1){
      println(key)
    }

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

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

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

注释掉的为:基础实现

未注释掉为:使用模式匹配的实现

package matchcase

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

    // 定义一个数组,其中有四个元素
    val arr = Array(11, 22, 33, 4,5,6)

    // 需求:补充定义三个变量:x,y,z,分别表示数组arr中第一个元素、第二个元素和第三个元素的值
//    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)
  }
}

其中: _*表示多个其他的元素值。