4.scala的模式匹配和样例类

时间:2022-05-17 05:49:51

Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。

并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。

一、字符串匹配

[java] view plain copy
  1. import scala.util.Random  
  2.   
  3. object CaseDemo01 extends App{  
  4.   val arr = Array("YoshizawaAkiho""YuiHatano""AoiSola")  
  5.   val name = arr(Random.nextInt(arr.length))  
  6.   name match {  
  7.     case "YoshizawaAkiho" => println("张老师...")  
  8.     case "YuiHatano" => println("李老师...")  
  9.     case _ => println("真不知道你们在说什么...")  
  10.   }  
  11. }  

二、类型匹配
[java] view plain copy
  1. import scala.util.Random  
  2.   
  3. object CaseDemo01 extends App{  
  4.   //val v = if(x >= 5) 1 else if(x < 2) 2.0 else "hello"  
  5.   val arr = Array("hello"12.0, CaseDemo)  
  6.   val v = arr(Random.nextInt(4))  
  7.   println(v)  
  8.   v match {  
  9.     case x: Int => println("Int " + x)  
  10.     case y: Double if(y >= 0) => println("Double "+ y)  
  11.     case z: String => println("String " + z)  
  12.     case _ => throw new Exception("not match exception")  
  13.   }  
  14. }  
注意:case y: Double if(y >= 0) => ...
模式匹配的时候还可以添加守卫条件。如不符合守卫条件,将掉入case _中


三、匹配数组、元组

[java] view plain copy
  1. object CaseDemo03 extends App{  
  2.   
  3.   val arr = Array(135)  
  4.   arr match {  
  5.     case Array(1, x, y) => println(x + " " + y)  
  6.     case Array(0) => println("only 0")  
  7.     case Array(0, _*) => println("0 ...")  
  8.     case _ => println("something else")  
  9.   }  
  10.   
  11.   val lst = List(3, -1)  
  12.   lst match {  
  13.     case 0 :: Nil => println("only 0")  
  14.     case x :: y :: Nil => println(s"x: $x y: $y")  
  15.     case 0 :: tail => println("0 ...$a")  
  16.     case _ => println("something else")  
  17.   }  
  18.   
  19.   val tup = (237)  
  20.   tup match {  
  21.     case (1, x, y) => println(s"1, $x , $y")  
  22.     case (_, z, 5) => println(z)  
  23.     case  _ => println("else")  
  24.   }  
  25. }  
注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2)  :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))


四、样例类

在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的

[java] view plain copy
  1. import scala.util.Random  
  2.   
  3. case class SubmitTask(id: String, name: String)  
  4. case class HeartBeat(time: Long)  
  5. case object CheckTimeOutTask  
  6.   
  7. object CaseDemo04 extends App{  
  8.   val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001""task-0001"))  
  9.   
  10.   arr(Random.nextInt(arr.length)) match {  
  11.     case SubmitTask(id, name) => {  
  12.       println(s"$id, $name")  
  13.     }  
  14.     case HeartBeat(time) => {  
  15.       println(time)  
  16.     }  
  17.     case CheckTimeOutTask => {  
  18.       println("check")  
  19.     }  
  20.   }  
  21. }  

五、o'ption 类型

在Scala中Option类型用样例类来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值

[java] view plain copy
  1. object OptionDemo {  
  2.   def main(args: Array[String]) {  
  3.     val map = Map("a" -> 1"b" -> 2)  
  4.     val v = map.get("b") match {  
  5.       case Some(i) => i  
  6.       case None => 0  
  7.     }  
  8.     println(v)  
  9.     //更好的方式  
  10.     val v1 = map.getOrElse("c"0)  
  11.     println(v1)  
  12.   }  
  13. }  

六、偏函数(如果想详细了解,可以参考博客:http://blog.csdn.net/bluishglc/article/details/50995939)

被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,常用作输入模式匹配

[java] view plain copy
  1. object PartialFuncDemo  {  
  2.   
  3.   def func1: PartialFunction[String, Int] = {  
  4.     case "one" => 1  
  5.     case "two" => 2  
  6.     case _ => -1  
  7.   }  
  8.   
  9.   def func2(num: String) : Int = num match {  
  10.     case "one" => 1  
  11.     case "two" => 2  
  12.     case _ => -1  
  13.   }  
  14.   
  15.   def main(args: Array[String]) {  
  16.     println(func1("one"))  
  17.     println(func2("one"))  
  18.   }