1. 程式人生 > >spark筆記之模式匹配和樣例類

spark筆記之模式匹配和樣例類

數組 object c spa 協調 一個 數據 好的 處理 zookeepe

階有一個十分強大的模式匹配機制,可以應用到很多場合:如開關語句,類型檢查等並且階還提供了樣例類,對模式匹配進行了優化,可以快速進行匹配。
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筆記之模式匹配和樣例類