matchcase

63 阅读3分钟

一.match case的用法

  1. 类似于else if这种多分支选择结构,精确匹配值
  2. case_ 是不可省略的。如果匹配不成功,又没有case_,程序会报错。
  3. case_必须放在最后
  4. _*占位符,表示多的部分放在这

任务:

  • 1.撰写一个函数,传入一个元组,其中元素个数各不相同

  • 2.匹配元组元素的数量

  • 3.匹配变量类型

  • 4.匹配元素特征

  • 5.样例类

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

(1) 撰写一个函数,传入一个元组,其中元素个数各不相同

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 42 => "湖北"
     case 11 => "北京"
     case _ => "未知"
   }
 }

(2) 匹配元组元素的数量

object matchcase02 {
  def main(args: Array[String]): Unit = {
    val xiaohonng = (100,100,100)
    val xiaohong = (89,98)
    getScore(xiaohong)
    getScore(xiaohong)
    getScore((1,2,3,4))
  }
    def getScore(score:Any):Unit = {
      score match {
        case (a,b,c) => println("元组中有三个元素:a = " +a+ "b=" +b+ "c=" +c)
        case (a,b) => println("元组中有两个元素:a = " +a+ "b=" +b)
        case _ => println("未知")
      }
    }
}

(3)匹配变量类型

object matchcase03 {
  def main(args: Array[String]): Unit = {
    testType(1)
    testType(1.11)
    testType("1")
    }
  def testType(i:Any): Unit = {
    i match {
      case x:Int => println("当前变量是:Int")
      case x:Double => println("当前变量是:Double")
      case _ => println("未知")
    }
  }
}

(4)匹配元素特征

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("未知")
  }
}

(5) 样例类

object matchcase05 {
  //定义一个样例类:圆形,它有一个属性:半径
  case class Circle(radius: Double)

  //定义一个样例类:矩形,它有两个属性:长和宽
  case class Rectangle(length: Double, width: Double)

  //定义一个方法,用来求圆形,矩形的面积
  def getArea(obj: Any): Double = {
    obj match {
      case Circle(radius) => println("圆形的面积是:" + radius * radius * 3.14)
      case Rectangle(width, length) => println("矩形的面积是:" + width * length)
      case _ => println("未知")
    }
  }

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

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

 def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5)
    //定义三个变量,分别设置初始值为arr的前三个元素的值?
    var a = arr(0)
    var b = arr(1)
    var c = arr(2)
    println("初始值a="+a+",b="+b+",c="+c)
    //使用模式匹配,将arr的前三个元素分别赋值给a,b,c
    val Array(x,y,z,_*) = arr
    //_*占位符,表示多的部分放在这
    println("模式匹配后a="+a+",b="+b+",c="+c)
  }

}

二.守卫

value match{ case 模式 if 条件 => 执行的事情 }

def main(args: Array[String]): Unit = {
 val a = 11
  a match {
    case x:Int if a>10 => println("a是大于10的Int")
    case _ => println("a is not Int")
  }
}

任务: 写一个函数,参数有两个。

一个是月份,一个是日期。返回值是对应的星座

1月20日到2月18日:水瓶座

object matchcase08 {
 def getZodiac(month:Int,day:Int):String={
   month match {
     case 1  if day >= 20 => "水瓶座"
     case 2  if day <= 18 => "水瓶座"
     case _ => "未知"
   }
  }
  def main(args: Array[String]): Unit = {
    println(getZodiac(1,19))//水瓶
    println(getZodiac(1,21))//水瓶座
  }
}