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