日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Scala模式匹配和类型系统

發布時間:2024/7/19 windows 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala模式匹配和类型系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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模式匹配和类型系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。