Scala零基礎教學【61-80】
第61講:Scala中隱式參數與隱式轉換的聯合使用實戰詳解及其在Spark中的應用源碼解析
第62講:Scala中上下文界定內幕中的隱式參數與隱式參數的實戰詳解及其在Spark中的應用源碼解析
/** * Scala中上下文界定內幕中的隱式參數與隱式參數的實戰詳解及其在Spark中的應用源碼解析 */ //[T: Ordering] 這種寫法 說明存在一個隱式類型Ordering[T] class Pair_Implicits[T: Ordering](val first: T, val second: T){ //聲明一個隱式類型對象傳入函數 def bigger(implicit ordered: Ordering[T]) = { if (ordered.compare(first, second) > 0) first else second } } class Pair_Implicitly[T: Ordering](val first: T, val second: T){ def bigger = /** * 在Predef中定義了implicitly一個方法 可以簡化上面的寫法 * @inline def implicitly[T](implicit e: T) = e * 不使用implicit的隱形類型轉換 */ if (implicitly[Ordering[T]].compare(first, second) > 0) first else second } class Pair_Implicitly_Ordereded[T: Ordering](val first: T, val second: T) { def bigger = { import Ordered._ if (first > second) first else second } } object Context_Bounds_Internals { def main(args: Array[String]): Unit = { println(new Pair_Implicits(7, 9).bigger) println(new Pair_Implicitly(7, 9).bigger) println(new Pair_Implicitly_Ordereded(7, 9).bigger) } }
第63講:Scala中隱式類代碼實戰詳解
import java.io.File import scala.io.Source object Context_Helper{ implicit class FileEnhancer(file : File){ def read = Source.fromFile(file.getPath).mkString } implicit class Op(x:Int){ def addSAP(second: Int) = x + second } } object Implicits_Class { def main(args: Array[String]){ import Context_Helper._ println(1.addSAP(2)) println(new File("F:\\1.txt").read) } }
第64講:Scala中隱式對象代碼實戰詳解
abstract class Template[T] { def add(x: T, y: T): T } abstract class SubTemplate[T] extends Template[T] { def unit: T } //執行過程檢查當前作用是否有 implicit object 限定的 類型為 SubTemplate 的對象, // 如有,則選取此對象。 object Implicits_Object { def main(args: Array[String]) { implicit object StringAdd extends SubTemplate[String] { override def add(x: String, y: String) = x concat y override def unit: String = "" } implicit object IntAdd extends SubTemplate[Int] { override def add(x: Int, y: Int) = x + y override def unit: Int = 0 } //含有隱式參數,m是隱式對象部分 def sum[T](xs: List[T])(implicit m: SubTemplate[T]): T = {println(xs,m) if (xs.isEmpty) m.unit else m.add(xs.head, sum(xs.tail))} println(sum(List(1, 2, 3, 4, 5))) println(sum(List("Scala", "Spark", "Kafka"))) } }
運行結果:
(List(1, 2, 3, 4, 5),com.wanji.scala.implicits.Implicits_Object$IntAdd$2$@6b143ee9)
(List(2, 3, 4, 5),com.wanji.scala.implicits.Implicits_Object$IntAdd$2$@6b143ee9)
(List(3, 4, 5),com.wanji.scala.implicits.Implicits_Object$IntAdd$2$@6b143ee9)
(List(4, 5),com.wanji.scala.implicits.Implicits_Object$IntAdd$2$@6b143ee9)
(List(5),com.wanji.scala.implicits.Implicits_Object$IntAdd$2$@6b143ee9)
(List(),com.wanji.scala.implicits.Implicits_Object$IntAdd$2$@6b143ee9)
15
(List(Scala, Spark, Kafka),com.wanji.scala.implicits.Implicits_Object$StringAdd$2$@1936f0f5)
(List(Spark, Kafka),com.wanji.scala.implicits.Implicits_Object$StringAdd$2$@1936f0f5)
(List(Kafka),com.wanji.scala.implicits.Implicits_Object$StringAdd$2$@1936f0f5)
(List(),com.wanji.scala.implicits.Implicits_Object$StringAdd$2$@1936f0f5)
ScalaSparkKafka
Scala零基礎教學【61-80】