Scala 提供了强大的模式匹配机制,应用也非常广泛。一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
-
通配模式、变量匹配和守卫
通配符 “_” 可以用来匹配任意对象。通常在模式匹配中作为最后一个匹配项,匹配其它所有的输入对象。
//变量常量匹配;守卫
def varCase(input: String): Unit = {
input match {
case "+" => println("+")
case "-" => println("-")
case ch if ch.length > 1 => println(ch) //给模式添加守卫,相当于一个判断条件
case _ => println("_")
}
}
-
类型匹配
可以根据表达式的类型进行匹配,在Scala中,我们更倾向于使用这种的模式匹配,而不是使用isInstanceOf
操作符.
//类型匹配
def typeCase(input: Any): Unit = {
input match {
case s: String => println("This is a String var: " + input)
case int: Int => println("This is a Int var: " + input)
case _ => println("This is not Int and String var: " + input)
}
}
-
匹配数组、列表和元组
//匹配数组,列表和元组
def arrayCase(arr: Array[String]): Unit = {
arr match {
case Array("Hello") => println("Array: Hello")
case Array(x, y) => println("length: " + arr.length)
case _ => println("_")
}
}
//匹配列表
def listMatch(list: List[String]): Unit = {
list match {
case "Hello" :: Nil => println("This list only contain hello.")
case "Hello" :: "Scala" :: Nil => println("Hello Scala.")
case x :: y :: Nil => println("x::y")
case _ => println("default list.")
}
}
//匹配元组
def pairMatch(input: Any): Unit = {
input match {
case ("Hello", _) => println("Hello")
case (x, "Hello", "Scala") => println(x + " Hello scala")
case _ => println("default value")
}
}
-
提取器
前面我们看到模式是如何匹配数组,列表和元组的,这些功能背后是提取器机制,带有从对象中提取值的unapply或unapplySeq方法的对象.unapply方法用于提取固定数量的对象,而unapplySeq提取的是一个序列.
arr match {
case Array(0, x) => ...
...
}
Array伴生对象就是一个提取器,定义了一个unapplySeq方法.该方法被调用时,以被执行匹配动作的表达式作为参数.Array.unapplySeq(arr)产出一个序列的值,即数组中的值.第一个值与零进行比较,二第二个值被赋值给x.
请关注作者公众号: