Scala模式匹配和类型系统
1.模式匹配比java中的switch case強大很多,除了值,類型,集合等進行匹配,最常見的Case class進行匹配,Master.scala有大量的模式匹配。
Case "_"表示不滿足上面的所有情況的體驗,舉個例子:
def bigdata(data: String){
data match{
case "Spack"=>println("WOW!!!")
case "Hadoop"=>println("OK")
case _=>println("sorry")
}
}
bigdata("Spack") ? ?//Wow!!!
可以在case里面加入條件判斷
def bigData(data:String)
{
??? data?match{
??????? case "Spark"=>println("Wow!!")
??????? case "hadoop"=> println("ok")
??????? case _ if data == "Flink" =>println("Flink")
??????? case _=>println("other")
??? }
} ?
? bigdata("Flink") ?//Flink
?對類型進行匹配
def exception(e: Exception){
e match{
??? casefileException:FileNotFoundException =>println("File not fount : " +fileException)
??? case _:Exception=>println("Exception" ,e)?}
} ? ? ? ? ? ? ? ? ?
?exception(new FileNotFoundException("oop!!!"))??? //> File notfount : java.io.FileNotFoundException: oop!!!
?對集合進行匹配
def data (array:Array[String])
{?? arraymatch{
??? case Array("Scala")=>println("Scala")
??? caseArray(spark,hadoop,flink)=>println(spark +" : " +hadoop +" : " +flink +" : ")
??? case Array("Spark",_*)=>println("Spark...")
??? case _=>println("Unkown")
??? }
}????????????????????????????????????????????????//> data: (array: Array[String])Unit
data(Array("Spark"))????????????????????????????? //> Spark...
data(Array("Scala"))?????????? ???????????????????//> Scala
data(Array("Scala","Spark","kafaka"))???????????? //> Scala : Spark : kafaka :
對class進行匹配
scala> case class Person(name: String)
defined class Person
?
case classPerson(name: String)
Person("Spark")?????????????????????????????????? // res0: worksheetest.Person = Person(Spark)
1:case class 相對于java中的bean,val 只有個get
2:實例自動調用伴生對象
class Person
case classWorker(name: String,salary: Double) extends Person
case classStudent(name: String,score: Double) extends Person
?
def sayHi(person:Person)
{
??? personmatch{
??????? case Student(name,score)=>println("I am Student :"+name +","+score)
??????? case Worker(name,salary)=>println("I am Worker :"+name +","+salary)
??????? case _ =>println("Unknown")
??? }
}??????????????????? ?????????????????????????????//> sayHi: (person: worksheetest.Person)Unit
?
sayHi(Worker("Worker",6.5))?????????????????????? //> I am Worker :Worker,6.5
sayHi(Student("Student",6.5))???????????????????? //> I am Student :Student,6.5
?
DeployMessages源碼中:
?caseclassExecutorStateChanged(
?????appId:String,
?????execId:Int,
?????state:ExecutorState,
?????message:Option[String],
?????exitStatus:Option[Int])
extends DeployMessage
?
case class 使用時會生成很多對象
case object 本身就是一個實例,全局唯一
?
scala 的類型參數(重磅的東西)最好的難點,太有用了,在所有的spark源碼中到處都是
例:RDD[T: ClassTag]
?
泛型,參數本身是有類型,scala的泛型,
泛型類和泛型函數
class Person[T](valcontent:T)
{
??? def getContent(id: T) = id+ " _ "+ content
}
val p = newPerson[String]("Spark")?????????????? //> p? :worksheetest.Person[String] = worksheetest$Person@50134894
p.getContent("Scala")???????????????????????????? //> res0: String = Scala _ Spark
泛型前面有+和-
?
* scala> def mkArray[T : ClassTag](elems: T*) =Array[T](elems: _*)
* mkArray: [T](elems: T*)(implicit evidence$1:scala.reflect.ClassTag[T])Array[T]
*
* scala> mkArray(42, 13)
* res0: Array[Int] = Array(42, 13)
*
* scala> mkArray("Japan","Brazil","Germany")
* res1: Array[String] = Array(Japan, Brazil, Germany)
* }}}
?
協變:如果S是T的子類型,并且List[S]也是List[T]的子類型,那么成為協變 class Person[+T] //強制定義為協變類型
?
C[+T]:如果A是B的子類,那么C[A]是C[B]的子類。逆變范圍小
C[-T]:如果A是B的子類,那么C[B]是C[A]的子類。協變 范圍大
C[T]:無論A和B是什么關系,C[A]和C[B]沒有從屬關系。
注:閱讀Spark源碼 RDD、HadoopRDD、SparkContext、Master、Worker的源碼,并分析里面使用的所有的模式匹配和類型參數的內容。
?總結:
T <% Writable: ClassTag
T可以隱身轉換為Writable類型
ClassTag在上下文中注入隱式值
對于Manifest Context Bounds
[T : Manifest] 進化為ClassTag了,T:ClassTag ?運行時傳遞完整的類型上下文信息
Seq[Dependency[_]] 相當于Seq[Dependency[T]]?
另外有段重要注釋:
{{{
* scala> def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
* mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
*
* scala> mkArray(42, 13)
* res0: Array[Int] = Array(42, 13)
*
* scala> mkArray("Japan","Brazil","Germany")
* res1: Array[String] = Array(Japan, Brazil, Germany)
* }}}
*
表明了ClassTag 的隱式轉換機制。
? ? ? ? ??
posted on 2016-01-21 01:32 hard-working 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/chenggongdeni/p/5147084.html
總結
以上是生活随笔為你收集整理的Scala模式匹配和类型系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sleep(),wait(),yield
- 下一篇: window下配置SSH连接GitHub