spark筆記之模式匹配和樣例類
阿新 • • 發佈:2018-08-02
數組 object c spa 協調 一個 數據 好的 處理 zookeepe 階有一個十分強大的模式匹配機制,可以應用到很多場合:如開關語句,類型檢查等並且階還提供了樣例類,對模式匹配進行了優化,可以快速進行匹配。
1.1。匹配字符串
1.1。匹配字符串
package cn.itcast.cases import scala.util.Random object CaseDemo01 extends App{ val arr = Array("hadoop", "zookeeper", "spark") val name = arr(Random.nextInt(arr.length)) name match { case "hadoop" => println("大數據分布式存儲和計算框架...") case "zookeeper" => println("大數據分布式協調服務框架...") case "spark" => println("大數據分布式內存計算框架...") case _ => println("我不認識你...") } }
1.2. 匹配類型
package cn.itcast.cases import scala.util.Random object CaseDemo01 extends App{ val arr = Array("hello", 1, 2.0, CaseDemo) val v = arr(Random.nextInt(4)) println(v) v match { case x: Int => println("Int " + x) case y: Double if(y >= 0) => println("Double "+ y) case z: String => println("String " + z) case _ => throw new Exception("not match exception") } }
註意:case y: Double if(y >= 0) => ...
模式匹配的時候還可以添加守衛條件。如不符合守衛條件,將掉入case _中。
1.3. 匹配數組、元組、集合
package cn.itcast.cases object CaseDemo03 extends App{ val arr = Array(1, 3, 5) arr match { case Array(1, x, y) => println(x + " " + y) case Array(0) => println("only 0") case Array(0, _*) => println("0 ...") case _ => println("something else") } val lst = List(3, -1) lst match { case 0 :: Nil => println("only 0") case x :: y :: Nil => println(s"x: $x y: $y") case 0 :: tail => println("0 ...") case _ => println("something else") } val tup = (1, 3, 7) tup match { case (1, x, y) => println(s"1, $x , $y") case (_, z, 5) => println(z) case _ => println("else") } }
註意:在Scala中列表要麽為空(Nil表示空列表)要麽是一個head元素加上一個tail列表。
9 :: List(5, 2) :: 操作符是將給定的頭和尾創建一個新的列表
註意::: 操作符是右結合的,如9 :: 5 :: 2 :: Nil相當於 9 :: (5 :: (2 :: Nil))
1.4. 樣例類
在Scala中樣例類是一種特殊的類,可用於模式匹配。
定義形式:
case class 類型,是多例的,後面要跟構造參數。
case object 類型,是單例的。
package cn.itcast.cases
import scala.util.Random
case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTask
object CaseDemo04 extends App{
val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))
arr(Random.nextInt(arr.length)) match {
case SubmitTask(id, name) => {
println(s"$id, $name")
}
case HeartBeat(time) => {
println(time)
}
case CheckTimeOutTask => {
println("check")
}
}
}
1.5. Option類型
在Scala中Option類型用樣例類來表示可能存在或者可能不存在的值(Option的子類有Some和None)。Some包裝了某個值,None表示沒有值
package cn.itcast.cases
object OptionDemo {
def main(args: Array[String]) {
val map = Map("a" -> 1, "b" -> 2)
val v = map.get("b") match {
case Some(i) => i
case None => 0
}
println(v)
//更好的方式
val v1 = map.getOrElse("c", 0)
println(v1)
}
}
1.6. 偏函數
被包在花括號內沒有match的一組case語句是一個偏函數,它是PartialFunction[A, B]的一個實例,A代表輸入參數類型,B代表返回結果類型,常用作輸入模式匹配,偏函數最大的特點就是它只接受和處理其參數定義域的一個子集。
[mw_shl_code = applescript,true] package cn.itcast.cases
對象PartialFuncDemo {
val func1:PartialFunction [String,Int] = {
case“one”=> 1
case“two”=> 2
case _ => -1
}
def func2 (num:String):Int = num match {
case“one”=> 1
case“two”=> 2
case _ => -1
}
def main(args:Array [String]){
println(func1(“one”) ))
println(func2(“one”))
}
} [/ mw_shl_code]
spark筆記之模式匹配和樣例類