Scala 提供了强大的模式匹配机制,应用也非常广泛。一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式
一、语法
变量 match {
case value1 => 代码1
case value2 => 代码2
...
}
match 对应 Java 里的 switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。
match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配
二、简单案例
/**
* @author Gjing
**/
object MatchApp {
def main(args: Array[String]) {
// 打印 many
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
}
三、类型匹配
/**
* @author Gjing
**/
object MatchApp {
def main(args: Array[String]) {
println(matchTest2("test"))
println(matchTest2(6))
}
def matchTest2(x: Any): Any = x match {
case x: String => "Scala.String"
case y: Int => "scala.Int"
case _ => "many"
}
}
实例中第一个 case 对应整型数值 1,第二个 case 对应字符串值 two,第三个 case 对应类型模式,用于判断传入的值是否为整型,相比使用isInstanceOf来判断类型,使用模式匹配更好。第四个 case 表示默认的全匹配备选项,
即没有找到其他匹配时的匹配项,类似 switch 中的 default
四、条件匹配
/**
* @author Gjing
**/
object MatchApp {
def main(args: Array[String]) {
println(matchTest3(1))
println(matchTest3("hello"))
println(matchTest3(2))
}
def matchTest3(value: Any): Any = value match {
case 1 => "输入的是:1"
case _ if (value.equals("hello")) => "world"
case _ => value
}
}
如果输入的不是1,那么会先进行条件判断,满足第二个case的话会走第二个case,否则会走最后一个case
五、数组匹配
/**
* @author Gjing
**/
object MatchApp {
def main(args: Array[String]) {
// 满足第一个case
println(matchTest4(Array(1)))
// 不满足第一个和第二个
println(matchTest4(Array(1,2)))
// 满足第二个
println(matchTest4(Array(2)))
}
def matchTest4(x: Array[Any]): Int = x match {
case Array(1) => 1
case Array(2, _*) => 666
case _ => 0
}
}
六、List匹配
和数组过滤类似,这里不再讲解,可以自己玩几把
七、样例类匹配
使用了case关键字的类定义就是就是样例类(case class),样例类是种特殊的类,经过优化以用于模式匹配
/**
* @author Gjing
**/
object MatchApp {
def main(args: Array[String]): Unit = {
println(matchTest5(Person("张三")))
println(matchTest5(Person("李四")))
println(matchTest5(Person("老王")))
}
def matchTest5(x:Person):String = x match {
case Person("张三") => "张三"
case Person("李四") => "李四"
case _ => "xx"
}
}
// 样例类
case class Person(name: String)
八、异常处理
/**
* @author Gjing
**/
object MatchApp {
def main(args: Array[String]): Unit = {
try {
val i = 10 / 0
println(i)
} catch {
case e: ArithmeticException => println("除数不能为0")
case e:Exception => println("最大异常")
}finally {
// 资源释放的东西,和java类似
}
}
}