// ------------------------ scala 模式匹配 match case ---------------------------------- /** * 类似于java中的 switch case ,java中switch case只能对值进行匹配,但scala的 match case 能对如下进行判断,范围更广 * 同时和java中switch case的另一个区别是 ,java的switch case需要使用break才能阻止,但scala的是只要有一个case分支满足并处理了,就不会继续判断下一个case分支了 * 1 对值进行匹配 * 2 对类型进行匹配 * 3 对Array和list元素进行匹配 * 4 对case class进行匹配 * 5 对有值没值进行匹配 * 值为下划线 _,则代表了不满足以上所有情况下的默认情况如何处理 * * match case if 在同一种情况下 进行更细致的划分 * 针对 _ 如果需要在case后得到这个具体的_的值,那么需要将下划线,替换为一个变量名,此时模式匹配语法就会将要匹配的值赋值给这个变量 然后在case 后饮用这个变量名即可得到 * 否则我们也不知道这个_对应的具体的值是什么 * * option : Some(a) 表示一定有值 、None表示没有值 */ // 对值进行匹配 def judgeScore(grade:String): Unit = { grade match{ case "A" => printf("Excellent") case "B" => printf("Good") case "C" => printf("Just so so") case _ => printf("you need work hard") } } // 对值进行匹配 增加if守卫 进行双重过滤 def judgeScore1(grade:String, name:String): Unit = { grade match{ case "A" => printf("Excellent") case "B" => printf("Good") case "C" => printf("Just so so") case _ if name == "zm" => printf(name + "you are Good") case _ => printf("you need work hard") } } //judgeScore1("F","zm1") import java.io._ // 对类型进行匹配 case 变量:类型 => 代码模式 def processException (e:Exception): Unit = { e match { case e1:IllegalArgumentException => printf("the exception is IllegalArgumentException: " + e1) case e2:FileNotFoundException => printf("the exception is FileNotFoundException: " + e2) case e3:IOException => printf("the exception is IOException: " + e3) case _:Exception => printf("the other excepion happended " ) } // 对Array数组进行匹配 匹配指定个数的数组 匹配以某个元素开头的数组 匹配带有指定元素的数组 这个效果没模拟出来 def greetArray(arr:Array[String]): Unit = { arr match { case Array("Leo") => printf("hello, Leo ") case Array(name1,name2,name3) => printf("the people name is" + name1 + " " + name2 + " " + name3) case Array("Leo",_*) => printf("hi,Leo, tell me you friends") case _ => print("hi,how are you") } } greetArray(Array("1","2","3")) // 针对数组调用 没有模拟出来 // scala中的 option 和模式匹配 /** * option只有两种值 一种是Some 表示有值, 一种是None 表示没值 * scala中使用 option 用于模式匹配中表示有值没值要比 Null更显得简洁 */ var personGrade = Map("zm"->"13","liang"->"7") var grade = personGrade.get("zm").get print(grade) println(12345) def getGrade(name:String): Unit = { var grade = personGrade.get(name) grade match { case Some(grade) => print("you grade is " + grade) case None => print("you are not here ") } } getGrade("zm2") } object Test { def main(args: Array[String]): Unit = { var personGrade = Map("zm"->"13","liang"->"7") //println(personGrade) //print( personGrade.get("zm").get ) def getGrade(name:String): Unit = { var grade = personGrade.get(name) grade match { case Some(grade) => print("you grade is " + grade) case None => print("you are not here ") } } // getGrade("zm") // 结果 you grade is 13 // 对Array数组进行匹配 匹配指定个数的数组 匹配以某个元素开头的数组 匹配带有指定元素的数组 这个效果没模拟出来 def greetArray(arr:Array[String]): Unit = { arr match { case Array("Leo") => printf("hello, Leo ") case Array(name1,name2,name3) => printf("the people name is" + name1 + " " + name2 + " " + name3) case Array("Leo",_*) => printf("hi,Leo, tell me you friends") case _ => print("hi,how are you") } } greetArray(Array("Leo")) // 针对数组调用 没有模拟出来 } }