模式匹配是Scala中非常有特色,非常强大的一种功能。
1.模式匹配
模式匹配,其实类似于Java中的switch case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理。不过Scala没有Java中的switch case语法,但是,Scala提供了更加强大的match case语法,就是这个模式匹配。
Java的switch case仅能匹配变量的值,而Scala的match case可以匹配各种情况,比如:变量的类型、集合的元素,有值没值。
2.对变量的值进行模式匹配
match case语法格式:变量 match { case 值 => 代码 },如果值为下划线,则代表了不满足以上所有情况下的默认处理。
def demo1(day: Int) {
day match {
case 1 => println("Monday")
case 2 => println("Tuesday")
case 3 => println("Wednesday")
case 3 => println("Thursday")
case 3 => println("Friday")
case 3 => println("Saturday")
case 7 => println("Sunday")
case _ => println("none")
}
}
执行:
scala> demo1(1)
Monday
scala> demo1(4)
none
3.变量类型的模式匹配
Scala的模式匹配一个强大之处就在于,可以直接匹配类型,而不是值。这点是java的switch case绝对做不到的。
语法格式:变量 match { case 变量: 类型 => 代码 } 典型的一个应用场景就是针对异常的处理。
import java.io._
def processException(e: Exception) {
e match {
case e1: IllegalArgumentException => println("IllegalArgumentException " + e1)
case e2: FileNotFoundException => println("FileNotFoundException " + e2)
case e3: IOException => println("IOException " + e3)
case _: Exception => println("Exception " )
}
}
测试:
scala> processException(new Exception())
Exception
在try-catch异常中的应用。
try {
val lines02 = scala.io.Source.fromFile("D://test02.txt").mkString
} catch {
case ex: FileNotFoundException => println("no file")
case ex: IOException => println("io exception")
case ex: Exception => println("exception")
}
4.case class与模式匹配
Scala中提供了一种特殊的类,用case class进行声明,中文可以称为样例类,case class其实有点类似于Java中的JavaBean的概念。即只定义field,会由Scala在编译时自动提供get和set方法,但是没有其它的method。
case class的主构造函数接收的参数通常不需要使用var或val修饰,Scala自动就会使用val修饰(但是如果你自己使用var修饰,那么还是会按照var来,在这用哪个区别都不大),Scala自动为case class定义了伴生对象,也就是object,并且定义了apply()方法,该方法接收主构造函数中相同的参数,并返回case class对象。
下面来看一个案例:
#先定义三个class
class Person
case class Teacher(name: String, sub: String) extends Person
case class Student(name: String, cla: String) extends Person
#再创建一个函数
def check(p: Person) {
p match {
case Teacher(name, sub) => println("Teacher, name is " + name + ", sub is " + sub)
case Student(name, cla) => println("Student, name is " + name + ", cla is " + cla)
case _ => println("none")
}
}
#测试执行
scala> check(new Student("tom","class1"))
Student, name is tom, cla is class1
scala> check(new Person())
none
5.Option与模式匹配
Scala有一种特殊的数据类型,叫做Option。Option有两种值,一种是Some,表示有值,一种是None,表示没有值。Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明了。
val ages = Map("jack" -> 18, "tom" -> 30, "jessic" -> 27)
def getAge(name: String) {
val age = ages.get(name)
age match {
case Some(age) => println("your age is " + age)
case None => println("none")
}
}
执行
scala> getAge("jack")
your age is 18
scala> getAge("hehe")
none