本文主要介绍 Scala 中的模式匹配
普通的模式匹配
val a = 1
val b = a match {
case 1 => 'a'
case 2 => 'b'
case _ => 'c'
}
- match 是表达式,不是语句,所以可以将 match 语句的值赋值给其他变量
带守卫的模式匹配
val a = 100
val b = a match {
case 1 => 'a'
case 2 => 'b'
case _ if a%10==0 => 'c'
case _ => 'd'
}
- 守卫可以是任何 boolean 条件
带变量的模式匹配
val a = 100
a match {
case 1 => 'a'
case 2 => 'b'
case ch => println(ch)}
// 100
- 匹配到的变量会被赋值,但是变量只存在与{}作用域内
带变量类型的模式匹配
val a = 100
val b = a match{
case 1 => 1
case 2 => 2
case x: Int => x
case s: String => s
}
// b = 100
序列的模式匹配
// 以Array为例
val a = Array(0, 1)
a match{
case Array(0) => 0
case Array(1) => 1
case Array(x, y) => x+y
}
变量声明中的模式匹配
val (x, y) = (1, 2)
// 把arr中的第一个和第二个元素赋值给x,y
val Array(x, y, _*) = arr
样例类
- 自带 apply 和 unapply 方法
- 构造器中的每一个参数都为 val 类型,除了被显示声明为 var 的
- 将生成 toString,equals,hashCode和copy方法
object test {
def main(args: Array[String]): Unit = {
t
}
def t: Unit = {
abstract class aa
case class a0(x: Int) extends aa
case class a1(x: Int, y: Int) extends aa
case object class o extends aa
def test(x: aa): Unit = {
x match{
// 自带apply方法,不需要new关键字
case a1(x, y) => println(x, y)
case a0(x) => println(x)
case _ => println("...")
}
}
test(a0(1))
}
}
参考资料:《快学Scala》