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))