提取器
這知識感覺多數跟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