1 package com.dtspark.scala.basics 2 3 4 //case class 是一個模式類,而case object 是全局的一個唯一的實例, 5 6 //模式類之間不能互相繼承,必須統一繼承一個抽象類或者trait 7 class DataFrameWork 8 //模式類,與普通類沒什么區別,只是一定要有參數 9 case class ComputationFramework(name:String,popular:Boolean)extends DataFrameWork 10 case class StorageFramework(name:String,popular:Boolean)extends DataFrameWork 11 12 object helloPatternMatch { 13 def main(args: Array[String]): Unit = { 14 getSalary("dddd",6) 15 getMatchType(6.0) 16 17 getMatchCollection(Array("Scala","hadoop")) 18 19 getBigDataType(ComputationFramework("Spark",true)) 20 21 22 val _map = Map("Spark"->"hot","hadoop"->"half_hot") 23 getValue("Spark",_map) 24 } 25 26 def getSalary(name:String,age:Int){ 27 name match{ 28 //從前往后匹配 29 case "Spark"=>println("$150000/year") 30 case "Hadoop"=>println("$100000/year") 31 //加入判斷條件(用變量接受參數) 32 case _name if age>=5 =>println(name+":"+age+" $140000/year") 33 case _ =>println("$90000/year")//都不匹配時 34 } 35 } 36 //對類型進行匹配 37 def getMatchType(msg:Any){ 38 msg match{ 39 case i : Int=>println("Integer") 40 case s : String=>println("String") 41 case d : Double=>println("Double") 42 case _=>println("Unknow type") 43 } 44 } 45 //對數組的匹配 46 def getMatchCollection(msg:Array[String]){ 47 msg match{ 48 49 case Array("Scala")=>println("one element") 50 case Array("Scala","Java")=>println("two element") 51 //以Scala開頭的數組(可有多個成員) 52 case Array("Scala",_*)=>println("many element begin from scala") 53 case _=>println("Unknow type") 54 } 55 } 56 //對類的匹配 57 def getBigDataType(data:DataFrameWork){ 58 data match{ 59 case ComputationFramework(name,popular)=> 60 println("computationFramework "+"name:"+name+" popular:"+popular) 61 case StorageFramework(name,popular)=> 62 println("StorageFramework "+"name:"+name+" popular:"+popular) 63 case _ =>println("Some other type") 64 65 } 66 } 67 /** 68 * 對map的匹配 69 * 特別注意some和none的使用 70 */ 71 def getValue(key:String,content:Map[String,String]){ 72 content.get(key) match{ 73 case Some(value)=>println(value) 74 case None=>println("No found!!") 75 } 76 } 77 78 }
添加內容1:對傳入參數個數的匹配。
其中第二個case表達的是如果這個數組傳入的是三個參數,則將第一個賦給scala,第二個賦給spark,第三個賦給flink,這三個都是變量名,然后在對這三個變量進行一些操作
命令行代碼:
scala> def data(array:Array[String]){ array match{ case Array("Scala")=>println("scala") case Array(scala,spark,flink) if(scala=="Spark")=>println(scala+" : "+spark+" : "+flink) case Array("Spark",_*)=>println("spark ....") case _ =>println("others") } } data: (array: Array[String])Unit
輸出:
scala> data(Array("Spark is good~!")) others scala> data(Array("Spark","ssd")) spark .... scala> data(Array("Spark","scala","flink")) Spark : scala : flink scala> data(Array("Spk","scala","flink")) others
添加內容2:case class的一些性質
1.定義為case class 的類在實例化時,可以不使用new 關鍵字。
case
class
People(name:String, age:Int)
val p = People(
"zs"
, 30)
2. 定義為case class 的類 默認實現了 equals 和hashcode 方法
3. 默認是可序列化的
4. 其構造函數的參數 是public 訪問的。如 p.name
5.支持模式匹配
命令行代碼:
scala> case class PhoneExt(name: String, ext: Int) defined class PhoneExt scala> val extensions = List(PhoneExt("steve", 100), PhoneExt("robey", 200)) extensions: List[PhoneExt] = List(PhoneExt(steve,100), PhoneExt(robey,200)) scala> extensions.filter { case PhoneExt(name, extension) => extension < 200 } res0: List[PhoneExt] = List(PhoneExt(steve,100))