Scala基础应用(4)- 样本类和模式匹配
样本类
就是在普通类前加了case
case class Test(param1: Int, param2: String ...) {
}
样本类带来的好处
- 省略掉new, 样本类实例化不需要在前面加new, 直接产生对象。
- 参数自动加val, 即样本类的参数缺省是不可修改的
- 自动加上toString, equals, hashcode三个方法
- 之所以可以省略new, 是因为Scala为样例类自动创建一个包含了apply和unapply的伴生类
模式匹配
模式在变量定义中
val myTuple = (123, "abc") val (aNumber, aString) = myTuple 声明两个变量及其值: aNumber = 133 aString = "abc"
for表达式里的模式
例1: var capitals = Map[String, String]("China" -> "BeiJing", "France" -> "Paris") for ((country, city) <- capitals) println(s"The capital of ${country} is ${city}") 例2: val results = List(Some("apple"), None, Some("orange")) for (Some(fruit) <- results) print(fruit) 结果为 apple orange 正如你看到的,for表达式模式还可以过滤掉不匹配的值。
偏函数模式
val withDefault: Option[Int] => Int = { case Some(x) => x case None => 0 }
match
4.1 通配模式
- 样式
变量 match { case 指定匹配值 => case _ => // 通配模式 }
4.2 简单模式种类
- 常量
val x = 5 val result = x match { case 5 => "five" } val x = 5 val y = 5 val result = x match { case `y` => "five" }
- 变量
val x = 5 val y = 5 val result = x match { case y => "five" }
- 构造器
case class Test(x: Int) val test1 = Test(5) val result = test1 match { case Test(5) => "five" case _ => }
- 序列模式
例1: val lst1 = List(0, 1, 2) val result = lst1 match { case List(0, _, _) => "3 values" case _ => } 例2: val lst1 = List(0, 1, 2) val result = lst1 match { case List(0, _*) => "3 values" case _ => }
- 元组模式
val tuple1 = (1, 2, 3) val result = tuple1 match { case (a, b, c) => "threee values" case _ => }
- 类型模式
val str = "this is a string" val result = str match { case s: String => "match" case _ => }
- 绑定变量
val x = 5 val result = x match { case y @ 5 => y + "five" }
- 模式守卫
val str = "this is a string" val result = str match { case s: String if s(0) == 't' => "match" case _ => }
- 模式重叠
val str = "this is a string" val result = str match { case s: String if s(0) == 't' => "match 0" case s: String if s(1) == 'h' => "match 1" case _ => }
4.3 封闭类
- 声明封闭类
sealed abstract class Expr
case class Var(name: String) extends Expr
case class Number(num: Double) extends Expr
case class UnOp(operator: String, arg: Expr) extends Expr
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
- 模式匹配
def describe(e: Expr) : String = e match {
case Number(_) => "a number"
case Var(_) => "a variable"
}
上面声明在编译时会出现警告,是的,编译器将检查封闭类所有可能的值是否都做了匹配