模式匹配是Scala中非常有特色且强大的功能。模式匹配类似于Java中的swich case语法即对一个值进行条件判断,针对不同的条件进行不同的处理。
但是Scala的模式匹配的功能比Java的swich case语法的功能要强大地多,Java的swich case语法只能对值进行匹配。Scala的模式匹配除了可以对值进行匹配之外,还可以对类型进行匹配、对Array和List的元素情况进行匹配、对case class进行匹配、甚至对有值或没值(Option)进行匹配。
模式匹配语法
scala使用match case的语法进行模式匹配。
变量 match {
case 值1 => 代码
case 值2 => 代码
case _ => 代码
}
如果值为下划线,则代表了不满足以上所有情况下的默认情况如何处理。
此外,match case中,只要一个case分支满足并处理了,就不会继续判断下一个case分支了。
变量值的模式匹配
使用case 值 => 代码这种语法进行值的模式匹配
Scala的模式匹配语法可以在值后面再加一个if守卫进行双重过滤。
def getSalary(name: String, age: Int) {
name match {
case "Spark" => println("$150000/year")
case "Hadoop" => println("$130000/year")
case _ if name == "Scala" => println("$140000/year")
case _ if name == "Python" => println("$100000/year")
case _ if name == "Hadoop MapReduce" => println("$90000/year")
case _name if age > 5 => println("name : " + name + " age : " + age + " $120000/year")
case _ => println("$80000/year")
}
}
类型的模式匹配
def getMatchType(msg : Any) {
msg match {
case i : Int => println("Integer")
case s : String => println("String")
case d : Double => println("Double")
case _ => println("Unknown type")
}
}
case class的模式匹配
class DataFrameWork
case class ComputationFramework(name: String, pupular:Boolean) extends DataFrameWork
case class StorageFramework(name:String, popular:Boolean) extends DataFrameWork
def getBigDataType(data: DataFrameWork){
data match {
case ComputationFramework(name, popular) => println("[ComputationFramework]name: " + name + " and popular: " + popular)
case StorageFramework(name, popular) => println("[StorageFramework]name: " + name + " and popular: " + popular)
case _ => println("Other situation")
}
}
Option的模式匹配
Scala有一种特殊的类型Option,Option有两种值,一种是Some,表示有值,一种是None,表示没有值。Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明了。
def getValue(key:String, content:Map[String, String]){
content.get(key) match {
case Some(value) => println(value)
case None => println("NOT FIND")
}
}
数组的模式匹配
def getMatchCollection(msg : Array[String]) {
msg match {
case Array("Scala") => println("One Element")
case Array("Scala", "Java") => println("Two Element")
case Array("Spark", _*) => println("Some Element begin with Spark")
case _ => println("Unknown type")
}
}
Tuple的模式匹配
def tupleMatch(t : Tuple2[String, String]) : String = t match {
case ("A", _) => "匹配以A开始的二元组"
case (_, "A") => "匹配以A结束的二元组"
case _ => "其他情况"
}
List 的模式匹配
def listMatch(list : List[String]) = list match {
case head :: Nil => "匹配只有一个元素的情况"
case x :: y :: Nil => "匹配只有两个元素的情况"
case "丽丽" :: tail => "匹配以丽丽开始的情况"
case head :: tail => "匹配多个元素的情况"
case _ => "其他情况"
}