1. 匹配变量
val array = Array("+", "-", "*", "/", "$$$")
val a = 10
val b = 5
val op = array(Random.nextInt(array.length))
val value: Any = op match {
case "+" => a + b
case "-" => a - b
case "*" => a * b
case "/" => a / b
case _ => "error op..."
}
println(value)
执行结果:
2. 匹配变量+条件过滤
def condition(score :String, name :String){
val result = score match {
case "A" => "班级前10%"
case "B" => "班级前30%"
case "C" => "班级前50%"
case _ if (name == "捣蛋鬼") => "班级Bug,没有排名!"
case _ => "班级前100%"
}
println(result)
}
condition("A", "东")
condition("Z", "东")
condition("Z", "捣蛋鬼")
执行结果:
3. 匹配数据类型
def dataTypeMatch(obj :Any){
obj match {
case i :Int => println("该参数数据类型为:Int")
case s :String => println("该参数数据类型为:String")
case m :Map[_,_] => println("该参数数据类型为:Map")
case _ => println("该参数数据类型为:其他类型")
}
}
dataTypeMatch(1)
dataTypeMatch("东")
dataTypeMatch(1.0)
dataTypeMatch(Map("zahngsan" -> 25))
执行结果:
4. 匹配Array
def matchArray(array: Array[Any]): Unit ={
array match {
case Array("东") => println("array中有且仅有一个元素,该元素为:东")
case Array(x, y) => println(s"array中有两个任意元素,分别为$x, $y")
case Array("东", _*) => println(s"array中至少有一个元素,且第一个元素为:东")
case _ => println(s"其他可能")
}
}
matchArray(Array("东"))
matchArray(Array(666, "东"))
matchArray(Array("东", 121,123))
matchArray(Array(666, 121,123))
执行结果:
匹配array中的数据,以及array中的数据提取。
Array(1,2,3,4) match {
case Array(1, 2, _, _) => println("匹配以1,2 开头具有4个元素的array")
case Array(1, 2, x, y) => println(s"匹配以1,2 开头具有4个元素的array,后两个元素为$x,$y")
case Array(1, _*) => println(s"匹配以1 开头具有一个以上元素的array")
case Array(1, other@_*) => println(s"匹配以1 开头具有一个以上元素的array,其他元素为$other")
case _ => println(s"其他情况")
}
5. 匹配List
def matchList(list: List[String]): Unit ={
list match {
case "东" :: Nil => println("匹配只有一个元素的list,且该元素为:东")
case a :: b :: Nil => println(s"匹配具有两个元素的list,分别为:$a, $b")
case "东" :: tail => println(s"匹配以东开头,至少一个元素的list,其他元素为:$tail")
case ::(head, tl) =>println(s"匹配以任意元素开头,并以head -> tail输出:$head -> $tl")
case List(x, other@_*) => println(s"匹配以任意元素开头,并输出除头元素的其他元素$other")
case _ =>println(s"其他情况")
}
}
matchList(List("东"))
matchList(List("list","匹配"))
matchList(List("东", "xxx", "yyy"))
matchList(List("xxx","yyy","zzz","----"))
执行结果:
6. 匹配Touple
val tuple = ("东", 24)
tuple match {
case (name, age) => println(s"name:$name, age:$age")
case _ => println("---")
}
执行结果:
7. 匹配Map
val grades = Map("东" -> 89, "XX" -> 88)
def matchMap(name : String): Unit ={
val grade: Option[Int] = grades.get(name)
grade match {
case Some(x) => println(s"name:$name, grade:$x")
case None => println("---")
}
}
matchMap("东")
matchMap("YY")
执行结果:
8. 匹配class
匹配calss需要实现伴生对象中的unapply方法,而匹配case calss不需要
def main(args: Array[String]): Unit = {
val people = new People("东", 23)
people match {
case People(name :String, age :Int) => println(s"name:$name, age:$age")
case _ => println("---")
}
}
class People(val name :String, val age :Int)
object People{
def unapply(people: People): Option[(String, Int)] ={
if(null != people){
Some(people.name, people.age)
}else{
None
}
}
}
执行结果:
9. 匹配case class、case object
/**
* Scala并发编程,Spark Core源码 -> 发送命令
* @param applicationId
* @param name
*/
case class SubmitApplication(applicationId :String, name :String = "spark")
case class KillApplication(applicationId :String)
case object CheckHeartTimeOut
val commands = Array(SubmitApplication("123"), KillApplication("123"), CheckHeartTimeOut)
1.to(5).map(x =>{
commands(Random.nextInt(commands.length)) match {
case SubmitApplication(applicationId , name ) => println("SubmitApplication")
case KillApplication(applicationId) => println("KillApplication")
case CheckHeartTimeOut => println("CheckHeartTimeOut")
case _ => println("---")
}
})
执行结果: