scala 模式匹配

135 阅读2分钟

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)

执行结果: image.png

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", "捣蛋鬼")

执行结果:

image.png

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))

执行结果:

image.png

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))

执行结果:

image.png


匹配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","----"))

执行结果:

image.png

6. 匹配Touple

val tuple = ("东", 24)
tuple match {
    case (name, age) => println(s"name:$name, age:$age")
    case _ => println("---")
}

执行结果:

image.png

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")

执行结果:

image.png

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
        }
    }
}

执行结果: image.png

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("---")
    }
})

执行结果:

image.png