scala中的case非常強大,既可以匹配值,匹配類型,匹配集合,匹配class,匹配object。
--case匹配值
scala> def bigData(data: String){
| data match{
| case "Spark" => println("Wow!")
| case "Hadoop" => println("Ok")
| case _ => println("Others") --下劃線代表其他情況,java每行要寫break,這裏不用
| }
| }
bigData: (data: String)Unit
scala> bigData("Spark")
Wow!
scala> bigData("Hadoop")
Ok
scala> bigData("Flink")
Others
scala> def bigData(data: String){
| data match{
| case "Spark" => println("Wow!")
| case "Hadoop" => println("Ok")
| case _ if data == "Flink" => println("Cool") --可以寫if進行判斷
| case _ => println("Others")
| }
| }
bigData: (data: String)Unit
scala> bigData("Flink")
Cool
scala> bigData("GreenPlum")
Others
scala> def bigData(data: String){
| data match{
| case "Spark" => println("Wow!")
| case "Hadoop" => println("Ok")
| case data1 if data == "Flink" => println("Cool " + data1) --賦值data1=data
| case _ => println("Others")
| }
| }
bigData: (data: String)Unit
scala> bigData("Flink")
Cool Flink
--------------------------------------------------------------------
--case不僅可以匹配值,也可以匹配類型。
scala> /////////////////////
scala> import java.io._
import java.io._
scala> def exception(e:Exception){
| e match{
| case x:FileNotFoundException => println("File not Found. "+x) --x是變量,可以隨便定義,x接收e的值
| case _:Exception => println(e)
| }
| }
exception: (e: Exception)Unit
scala> exception(new FileNotFoundException("Oh!"))
File not Found. java.io.FileNotFoundException: Oh!
--------------------------------------------------------------------
--case匹配集合
scala> /////////////////////
scala> def data(array: Array[String]){
| array match{
| case Array("Scala") => println("Scala")
| case Array(var1,var2,var3) => println(var1+" "+var2+" "+var3) --匹配長度爲3的數組
| case Array("Spark",_*) => println("Spark...") --匹配第一個元素爲Spark
| case _ => println("Unknown")
| }
| }
data: (array: Array[String])Unit
scala> data(Array("Scala"))
Scala
scala> data(Array("Spark"))
Spark...
scala> data(Array("Spark","Scala","Kafka"))
Spark Scala Kafka
scala> data(Array("Spark","Scala"))
Spark...
--------------------------------------------------------------------
--case class 樣例類
case object有時也這樣用
case class相當於java中的been,參數被封裝爲消息,一般不會改變。默認情況下只有getter。
裏面默認情況下是隻讀成員,特別適合併發編程時候的消息通信
一般只定義屬性,由scala編譯的時候自動生成getter和setter,但是它沒有其他的方法。
在接收參數的時候不需要val/var定義,此時scala會自動用val修飾,你也可以手動去寫var,但var代表可以修改裏面的內容,這沒有必要,而且也不符合java been或者消息通信體的設計的目的。
scala> case class Person(name: String)
defined class Person
scala> Person("Spark")
res217: Person = Person(Spark)
在內部工作的時候,會生成當前case class的半生對象,會自動生成object,會有apply方法。
參數Spark會作爲半生對象的apply方法的參數,apply接收這個參數後,會幫助我們構建實際的case class對象。
scala> class Person
defined class Person
warning: previously defined object Person is not a companion to class Person.
Companions must be defined together; you may wish to use :paste mode for this.
scala> case class Worker(name: String,salary: Double) extends Person
defined class Worker
scala> case class Student(name: String,score: Double) extends Person
defined class Student
scala> def sayHi(p: Person){
| p match{
| case Worker(name,salary) => println("I am a Worker: "+name+salary)
| case Student(name,score) => println("I am a Student: "+name+score)
| case _ => println("Unknown")
| }
| }
sayHi: (p: Person)Unit
scala> sayHi(Worker("LeiFeng",3000.65))
I am a Worker: LeiFeng3000.65
scala> sayHi(Student("Lucy",20.5))
I am a Student: Lucy20.5
case class在工作的時候,會生成很多的實例,每次工作都會生成實例。
Spark源碼中:
worker發送心跳給master,master接收心跳,通過case Heartbeat判斷workerId有沒有值。
--Master.scala
override def receive: PartialFunction[Any, Unit] = {
...
case Heartbeat(workerId, worker) => {
idToWorker.get(workerId) match {
case Some(workerInfo) => --idToWorker.get(workerId)能返回workerInfo
workerInfo.lastHeartbeat = System.currentTimeMillis()
case None =>
if (workers.map(_.id).contains(workerId)) {
logWarning(s"Got heartbeat from unregistered worker $workerId." +
" Asking it to re-register.")
worker.send(ReconnectWorker(masterUrl))
} else {
logWarning(s"Got heartbeat from unregistered worker $workerId." +
" This worker was never registered, so ignoring the heartbeat.")
}
}
}
Some:代表有值
None:代表沒有值
private val idToWorker = new HashMap[String, WorkerInfo]
Some[+A](x: A) extends Option[A] with Product with Serializable
--Worker.scala
case SendHeartbeat =>
if (connected) { sendToMaster(Heartbeat(workerId, self)) }
--DeployMessage.scala
private[deploy] sealed trait DeployMessage extends Serializable
case class Heartbeat(workerId: String, worker: RpcEndpointRef) extends DeployMessage
scala case匹配值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.