Scala學習——match,case 模式匹配


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM