1. 程式人生 > >Scala零基礎教學【61-80】

Scala零基礎教學【61-80】

string 源碼解析 true mfile bst 是否 class getpath spark

第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】