scala case匹配值

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章