Scala入門之提取器

提取器

這知識感覺多數跟case class配合使用,但是在與case class配合使用時就算不知道後面的工作機制也沒什麼關係,會用就行。
其實有必要的話可以自己寫提取器,而什麼時候用提取器,怎麼提高數據傳輸效率纔是難點 :(
直接上代碼,加上個人理解
package com.dt.scala.moguyun

/**
  * 提取器
  * unapply
  * 看兩點:
  * 1 類有沒有unapply方法
  * 2 unapply方法裏傳的參數是不是右邊的
  * 即可調用
  * Created by hlf on 2016/8/11.
  */


case class Person1(name: String, age: Int) {
  val content = name
}
case class Person2(name: String, age: Int, salary: Int) {
}

/**
  * 新建類,裏面有apply和unapply方法
  */
class DTCoder(val name: String, val salary: Int)

object DTCoder {
  def apply(name: String, salary: Int) = {
    println("DTCoder apply methode invoked !!!")
    new DTCoder(name, salary)
  }

  def unapply(information: DTCoder) = {
    Some((information.name, information.salary))

    /*
    //少見,基本都是傳入一個對象
    def unapply(information:String)= {
       Some((information.substring(0,information.indexOf(" ")),information.substring(0,information.indexOf(" ")+1)))
       }
    */
  }
}

object HelloExtractor {
  def main(args: Array[String]): Unit = {
    //case class會自動生成apply和unapply方法,所以不用new,
    //Person1("spark", 6)與下面的是一樣的
    val person = Person1.apply("spark", 6)
    //將person用unapply提取出name,age賦值給另一個case class
    //賦值給同類型的case class
    val Person1(name1, age1) = person
    //賦值給不同類型的case class
//    val Person2(name2, age2) = person//運行時報錯,說要求是Person1纔行
    println("person1" + name1 + " : " + age1)
//    println("person2" +name2 + " : " + age2)

    person match {
      case Person1(name, age) => println("wow   " + name + " : " + age)
    }

    val dtcoder = DTCoder("hadoop", 200)
    println(dtcoder.name + ": " + dtcoder.salary)
    //像這種用提取器提取出來再賦值給同一個類型對象有意思嗎?還不如用上面的dtcoder.name點出來呢 -_-!
    val DTCoder(dtname1, dtsalary1) = dtcoder
    println("dtname1   " + dtname1 + " : " + dtsalary1)

    /*
    val DTCoder(dtname,dtsalary) = "spark 100"
      println("dtname   "+dtname+ " : " +dtsalary)
      */
    //從字符串通過提取器構建出一個類,在網絡傳輸時能大大提高性能,這是一個思考方向。

  }

}
結果
person1spark : 6
wow   spark : 6
DTCoder apply methode invoked !!!
hadoop: 200
dtname1   hadoop : 200

以上內容來自[DT大數據夢工廠]首席專家Spark專家王家林老師的課程分享。感謝王老師的分享,更多精彩內容請掃描關注[DT大數據夢工廠]微信公衆號DT_Spark

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