← 返回首页
Scala模式匹配
发表时间:2023-09-10 11:12:08
Scala模式匹配

模式匹配是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