scala-模式匹配(字符串、数组、元组、集合、类、偏函数)
Scala 提供了强大的模式匹配机制,应用也非常广泛。
一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
一、字符串模式匹配
package day02.mathdemo import scala.util.Random /** * 模式匹配(字符串) * 类似于Java中的switch case */ object MatchStr{ def main(args: Array[String]): Unit = { val arr = Array("xm","xh","xl","xzs") val name = arr(Random.nextInt(arr.length)) println("name: "+name) name match { case "xm" =>println("小明") case "xh" =>println("小红") case "xl" =>println("小亮") case "xzs" =>println("小竹笋") case _ =>println("Nothing") } } }
打印结果
二、数组
package day02.mathdemo //模式匹配 import scala.util.Random object MatchType { def main(args: Array[String]): Unit = { val arr = Array("xm", 123, 3.26, true, MatchType) val name = arr(Random.nextInt(arr.length)) println("name: " + name) name match { case str: String => println(s"match String $str") case int: Int => println(s"match Int $int") case double: Double => println(s"match Double $double") case boolean: Boolean => println(s"match Boolean $boolean") case matchTest: MatchTest => println(s"match MatchTest $matchTest") case _: Any => println("nothing") } } } class MatchTest{ }
打印结果:
三、元组、集合
package day02.mathdemo /** * 匹配数组、元组、集合 */ object MatchList { def main(args: Array[String]): Unit = { /* *匹配数组 */ val arr = Array(1,4,6,8) arr match { case Array(1,x,y,z) =>println(s"case: $x,$y,$z") case Array(_,x,y) => println(s"case: $x,$y") case _ => println("nothing") } /* *匹配元组 * 注意:元组匹配中的时候,元组内的个数是确定的 */ val tup = (1,4,6,8) tup match { case (1,x,y,z) =>println(s"case: $x,$y,$z") case (4,w,s,t) => println(s"case: $w,$s,$t") case _ => println("nothing") } /* *匹配集合 * 注意: ::表示从右往左list合并; * NIL表示空的集合; * case1表示是一个空的list集合+0 就是只有一个0的list集合。 */ val list01 = List(0,1,3,5,6) list01 match { case 0 :: Nil =>println("case1:0") case a :: b :: c :: d :: e :: Nil =>println(s"case2 : $a,$b,$c,$d,$e") case 0 :: b :: Nil =>println(s"case3: $b") case List(0,1,3,5,6) => println("这个也可以匹配到") case _ => println("not found") } } }
打印结果:
四、类
package day02.mathdemo import scala.util.Random /** * 样例类 * 注意:在样例类中case中,需要将参数设定好 */ object CaseClassDemo { def main(args: Array[String]): Unit = { val arr = Array(HertBeat(2000L),SubmitTask("1000","提交"),CheckTimeOutTask) arr(Random.nextInt(arr.length)) match { case HertBeat(time) =>println("HertBeat") case SubmitTask(id,task) =>println("submitTask") case CheckTimeOutTask =>println("CheckTimeOutTask") } } } case class HertBeat(time:Long) case class SubmitTask(id:String,task: String) case class CheckTimeOutTask
打印结果:
五、偏函数
package day02.mathdemo import scala.util.Random /** * 模式匹配-偏函数PartialFunction[A,B] * A:参数类型 * B:返回值类型 * 常用:输入模式匹配 * */ object PartialFunctionDemo { def m1:PartialFunction[String,Int] = { case "one" => { println("I am one") 1 } case "two" => { println("I am two") 2 } } def m2(str:String):Int = str match { case "one" =>{ println("I am one one") 11 } case "two" =>{ println("I am two two") 2 } } def main(args: Array[String]): Unit = { val str = Array("one","two") m1(str(Random.nextInt(str.length))) m2(str(Random.nextInt(str.length))) } }
打印结果: