模式匹配-基础使用

28 阅读2分钟

我们今天接到一个开发任务,就是根据身份证号码,输出这个人的籍贯。例如:42表示湖北,33表示浙江,11表示北京,31表示上海。

分析问题并解决

根据一个值输出另一个与之对应的值,很容易就想到if else

参考代码如下

object ProvinceCodeLookup {
    def main(args: Array[String]): Unit = {
        val code = "42"
        val provinceName = getProvinceName(code)
        println(provinceName)
    }
    def getProvinceName(code: String): String = {
        if (code == "42") {
            "湖北"
        } else if (code == "33") {
            "浙江"
        } else if (code == "11") {
            "北京"
        } else if (code == "31") {
            "上海"
        } else {
            "未找到对应的省份"
        }
    }
}

直接用 match case 来改造

object case01 {
    def main(args: Array[String]): Unit = {
      // val code = "11"
      // var province = ""
      //
      // if(code == "42"){
      //     province = "湖北"
      // } else if(code == "11") {
      //     province = "北京"
      // } else {
      //     province = "未知"
      // }

      val code = "11"
      val province = code match {
        case "42" => "湖北"
        case "11" => "北京"
        case _ => "未知"
      }
      println(s"${code} 对应的省份是:${province}")
    }
}

match case的基本格式

value match {
  case pattern1 => result1
  case pattern2 => result2
...
  case patternN => resultN
case _ => 其他
}

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

示例如下

object case02 {
  def main(args: Array[String]): Unit = {
    // 输入一个1-5的数字,打印它对应的英语单词。
    val num = "1"  // 这里可以替换为实际输入的数字(比如从控制台读取)
    val word = num match {
      case "1" => "one"
      case "2" => "two"
      case "3" => "three"
      case "4" => "four"
      case "5" => "five"
      case _ => "未知数字"
    }
    println(s"${num} 对应的英文是:${word}")
  }
}

高阶匹配之元组元素数量

前面的匹配都是精准匹配:变量和值是相等的。但是呢,scala中的模式匹配的规则是非常强大的,不一定是精准的匹配值,还可以根据元组的元素的个数来匹配。

格式:

val t1 = (2,3)
val t1 = (2,3,4)
val t1 = (2,3,4,5)  
t1 match {
  case (first, second) => "有两个元素"
  case (x1,x2,x3) => "有三个元素"
  case _ => "其他情况"
}
println(output)

代码示例:

object case03 {
  /*
match case 高阶匹配
1. 匹配元组不同的元素的数量
*
* */
  def main(args: Array[String]): Unit = {
    // 元组
    val t1 = (1,2)

    t1 match {
      case (a,b) => println(s"有二个元素${a}, ${b}")
      case _ => println("未知")
    }

    val arr1 = Array(10,2)
    arr1 match {
      case Array(1,x,y) => println("数组,第一个元素是1,长度为3")
      case Array(10,_) => println("数组,第一个元素是10,长度为2")
      case _ => println("其他")
    }
  }
}