1. 程式人生 > >第16課:Scala implicits程式設計徹底實戰及Spark原始碼鑑賞

第16課:Scala implicits程式設計徹底實戰及Spark原始碼鑑賞

本節課主要講的內容:
1、函式隱式轉換
2、隱式引數
3、隱式類
4、隱式物件
本節課搜狐視訊地址:http://my.tv.sohu.com/us/299637343/84785657.shtml
隱式轉換:當某個類沒有具體的方法時,可以在該類的伴生物件或上下文中查詢是否存在隱式轉換,將其轉換為可以呼叫該方法的類,通過程式碼簡單的描述下

一:隱式轉換
1、定義類Man
class Man(val name: String)
2、定義類SuperMan,並在類中定義一個方法
class SuperMan(val name: String) {
  def makeMiracles = println(this.name + " is super man!")
}
3、在main方法中例項化man類,並呼叫makeMiracles方法,這時編譯報錯,提示man中沒有這樣的方法
    val man = new Man("Scala")
    man.makeMiracles  // 編譯報錯,提示man中無這樣的方法
4、這時候我們就可以通過隱式轉換的方式將man轉換為SuperMan,這時候就可以呼叫makeMiracles
object Man {
  //隱式轉換
  implicit def manToSuperMan(man: Man) = new SuperMan(man.name)
}

完整程式碼:
class Man(val name: String)
class SuperMan(val name: String) {
  def makeMiracles = println(this.name + " is super man!")
}
object Man {
  //隱式轉換
  implicit def manToSuperMan(man: Man) = new SuperMan(man.name)
}
  def main(args: Array[String]): Unit = {
    val man = new Man("Scala")
    man.makeMiracles
}

二:隱式引數
簡單看下程式碼:
def talk(name: String)(implicit content: String) {
    println(name + ":" + content)
  }
這裡的content就是定義為隱式引數,在呼叫的時候如果定義了隱式變數,則可以不傳content引數
implicit val content = "Money"
talk("Spark")  //如果上下文沒有定義隱式變數,則需傳兩個引數,也可以傳兩個引數進行覆寫隱式值
talk("Spark")("Scala") //Scala會覆蓋Money

三:隱式類
  //隱式類
  implicit class sum(x: Int) {
    def add(y: Int) = x + y
  }
 //隱式類
println(3.add(2))  //本身3是沒有add這樣的方法,通過隱式類轉換,就可以實現這樣的功能,主要是看上下文中是否有引數為Int型別的隱式轉換操作

四:隱式物件
示例程式碼:
abstract class Template[T] {
  def add(x: T, y: T): T
  def unit: T
}
//隱式物件
object ScalaImplicitObject {
  implicit object StringAdd extends Template[String] {
    override def add(x: String, y: String) = x.concat(y)
    override def unit: String = ""
  }
  implicit object IntAdd extends Template[Int] {
    override def add(x: Int, y: Int) = x + y
    override def unit: Int = 0
  }
}

定義sum方法
  def sum[T](list: List[T])(implicit t: Template[T]): T = {
    if (list.isEmpty) t.unit
    else t.add(list.head, sum(list.tail)) //遞迴呼叫sum
  }

在main方法中呼叫
import com.dt.scala.ScalaImplicitObject._  //匯入隱式轉換
println(sum(List(1 to 100: _*)))
println(sum(List("Spark", "-", "Scala")))
備註:
資料來源於:DT_大資料夢工廠(Spark"蘑菇雲"行動)
更多私密內容,請關注微信公眾號:DT_Spark
如果您對大資料Spark感興趣,可以免費聽由王家林老師每天晚上20:00開設的Spark永久免費公開課,地址YY房間號:68917580