Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。
并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。
一、字符串匹配
- import scala.util.Random
- object CaseDemo01 extends App{
- val arr = Array("YoshizawaAkiho", "YuiHatano", "AoiSola")
- val name = arr(Random.nextInt(arr.length))
- name match {
- case "YoshizawaAkiho" => println("张老师...")
- case "YuiHatano" => println("李老师...")
- case _ => println("真不知道你们在说什么...")
- }
- }
二、类型匹配
- import scala.util.Random
- object CaseDemo01 extends App{
- //val v = if(x >= 5) 1 else if(x < 2) 2.0 else "hello"
- val arr = Array("hello", 1, 2.0, CaseDemo)
- val v = arr(Random.nextInt(4))
- println(v)
- v match {
- case x: Int => println("Int " + x)
- case y: Double if(y >= 0) => println("Double "+ y)
- case z: String => println("String " + z)
- case _ => throw new Exception("not match exception")
- }
- }
模式匹配的时候还可以添加守卫条件。如不符合守卫条件,将掉入case _中
三、匹配数组、元组
- object CaseDemo03 extends App{
- val arr = Array(1, 3, 5)
- arr match {
- case Array(1, x, y) => println(x + " " + y)
- case Array(0) => println("only 0")
- case Array(0, _*) => println("0 ...")
- case _ => println("something else")
- }
- val lst = List(3, -1)
- lst match {
- case 0 :: Nil => println("only 0")
- case x :: y :: Nil => println(s"x: $x y: $y")
- case 0 :: tail => println("0 ...$a")
- case _ => println("something else")
- }
- val tup = (2, 3, 7)
- tup match {
- case (1, x, y) => println(s"1, $x , $y")
- case (_, z, 5) => println(z)
- case _ => println("else")
- }
- }
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
四、样例类
在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的
- import scala.util.Random
- case class SubmitTask(id: String, name: String)
- case class HeartBeat(time: Long)
- case object CheckTimeOutTask
- object CaseDemo04 extends App{
- val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))
- arr(Random.nextInt(arr.length)) match {
- case SubmitTask(id, name) => {
- println(s"$id, $name")
- }
- case HeartBeat(time) => {
- println(time)
- }
- case CheckTimeOutTask => {
- println("check")
- }
- }
- }
五、o'ption 类型
在Scala中Option类型用样例类来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值
- object OptionDemo {
- def main(args: Array[String]) {
- val map = Map("a" -> 1, "b" -> 2)
- val v = map.get("b") match {
- case Some(i) => i
- case None => 0
- }
- println(v)
- //更好的方式
- val v1 = map.getOrElse("c", 0)
- println(v1)
- }
- }
六、偏函数(如果想详细了解,可以参考博客:http://blog.csdn.net/bluishglc/article/details/50995939)
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,常用作输入模式匹配
- object PartialFuncDemo {
- def func1: PartialFunction[String, Int] = {
- case "one" => 1
- case "two" => 2
- case _ => -1
- }
- def func2(num: String) : Int = num match {
- case "one" => 1
- case "two" => 2
- case _ => -1
- }
- def main(args: Array[String]) {
- println(func1("one"))
- println(func2("one"))
- }
- }