我们今天接到一个开发任务,就是根据身份证号码,输出这个人的籍贯。例如: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("其他")
}