模式匹配-基础使用

114 阅读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 来改造

match case的基本格式

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

val code = "11"
val province = code match {
  case "42" => "湖北"
  case "11" => "北京"
  case _ => "未知"
}

例:输入一个1-5的数,输出它的英文

//输入一个1-5的数字,打印它对应的英语单词
val input = scala.io.StdIn.readLine("请输入一个1-5的数字:").trim

// 使用模式匹配转换数字到单词,增加默认分支处理非法输入
val word = input match {
  case "1" => "one"
  case "2" => "two"
  case "3" => "three"
  case "4" => "four"
  case "5" => "five"
  // 处理非1-5的输入情况
  case _ => {
    println("输入错误!请输入1到5之间的整数")
    // 返回空字符串标识错误
    ""
  }
}
if (word.nonEmpty) {
  println(s"数字 $input 对应的英语单词是: $word")
}

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

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

// 元组
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,x) => println("数组,第一个元素时10,长度为2")
  case _ => println("其他")
}