欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何進(jìn)行scala隱式轉(zhuǎn)換及Spark源碼解析

本篇文章為大家展示了如何進(jìn)行scala隱式轉(zhuǎn)換及Spark源碼解析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

十載專注成都網(wǎng)站制作,成都定制網(wǎng)站,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)站,高端網(wǎng)頁制作,對(duì)成都格柵板等多個(gè)領(lǐng)域,擁有豐富的營銷推廣經(jīng)驗(yàn)。

隱式轉(zhuǎn)換,是scala當(dāng)中一個(gè)重要的特性,今天我們結(jié)合自己的例子和spark源碼,爭(zhēng)取對(duì)隱式轉(zhuǎn)換有一個(gè)更加深入的了解。

關(guān)于implicit有3種使用方式,implicit def、implicit class以及implicit 參數(shù)

首先看一下implicit def的用法:

object implicitTest {
  class Man(val name: String){
    def work(){println(name + " is working!")}
  }

  class Woman(val name: String){
    def shop(){println(name + " is shopping!")}
  }

  class Child(val name: String){
    def play(){println(name + " is playing!")}
  }

  implicit def manToWoman(man: Man) = new Woman(man.name)
  implicit def manToChild(man: Man) = new Child(man.name)

  def main(args: Array[String]): Unit ={
    val man = new Man("Tom")
    val woman = new Woman("Lily")
    val child = new Child("baby")
    man.work()
    man.shop()
    man.play()
  }
}

在上面的代碼當(dāng)中,我們定義了3個(gè)class,Man、Woman、Child,他們之間沒有任何繼承關(guān)系。下面的main函數(shù)當(dāng)中,我們聲明了Man、Woman、Child,各一個(gè)實(shí)例,我們考慮,作為男人來講,是不是也不一定只能是工作,適當(dāng)?shù)男蓍e和娛樂是不是也是可以的。所以我們做了2個(gè)隱式轉(zhuǎn)換的函數(shù),manToWoman和manToChild,需要注意的是,這兩個(gè)函數(shù)名其實(shí)一點(diǎn)都不重要,我們只是希望看起來更容易理解一些,你寫個(gè)aaa或者bbb,一點(diǎn)問題都沒有。

編譯過程大概是這樣的:

1、編譯man.shop(),發(fā)現(xiàn)并沒有shop方法,即將報(bào)錯(cuò)

2、報(bào)錯(cuò)之前,搜索一下作用域內(nèi),有沒有隱式轉(zhuǎn)換函數(shù),能夠支持man對(duì)shop的調(diào)用,找到了manToWoman。

3、把man變成woman,調(diào)用shop方法

之后再看一下implicit class的用法:

object implicitTest {
  class Man(val name: String){
    def work(){println(name + " is working!")}
  }

  class Woman(val name: String){
    def shop(){println(name + " is shopping!")}
  }

  class Child(val name: String){
    def play(){println(name + " is playing!")}
  }

  implicit class ManConvert(m: Man){
    def shop() = new Woman(m.name).shop()
    def play() = new Child(m.name).play()
  }

  def main(args: Array[String]): Unit ={
    val man = new Man("Tom")
    val woman = new Woman("Lily")
    val child = new Child("baby")
    man.work()
    man.shop()
    man.play()
  }
}

這個(gè)當(dāng)中實(shí)現(xiàn)的效果看起來和前一種差不多,其實(shí)它的語義是完全不同的。編譯過程大概是這樣的:

1、編譯man.shop(),發(fā)現(xiàn)并沒有shop方法,即將報(bào)錯(cuò)

2、報(bào)錯(cuò)之前,搜索一下作用域內(nèi),看看有沒有隱式轉(zhuǎn)換類,能夠?yàn)閙an提供shop方法,找到了ManConvert

3、將man轉(zhuǎn)換為ManConvert,執(zhí)行shop方法。

最后我們?cè)倏匆幌耰mplicit參數(shù)的用法:

object implicitTest {
  class Man(val name: String){
    def work(){println(name + " is working!")}
    def marry(implicit w: Woman){println(name + " marryed " + w.name)}
  }

  class Woman(val name: String){
    def shop(){println(name + " is shopping!")}
  }

  def main(args: Array[String]): Unit ={
    val man = new Man("Tom")
    implicit val woman = new Woman("Lily")
    man.marry
  }
}

我們?yōu)镸an增加了一個(gè)marry的方法,它的參數(shù)w是implicit的,然后調(diào)用的時(shí)候,我們先在前面聲明了一個(gè)implicit 類型的woman,之后調(diào)用marry但是不指定參數(shù),這樣是不會(huì)報(bào)錯(cuò)得到。但是如果我們?cè)趍arry的前面聲明了2個(gè)implicit的woman,那么marry還是會(huì)報(bào)錯(cuò)的。

換成人類的語言來解釋這件事:一個(gè)男人要結(jié)婚,如果指定結(jié)婚對(duì)象,那沒問題,如果沒指定,那就看看身邊有沒有適合的結(jié)婚對(duì)象,有的話,就直接生米煮成熟飯,可是如果身邊有2個(gè),好吧,我也不知道該娶哪個(gè)!

結(jié)合Spark源碼,我們來深入理解一下implicit,看下面這段代碼:

val rdd = sc.textFile("hdfs://master:9000/woozoom/mavlink1.log", 12).zipWithIndex()
rdd.sortByKey()

看起來是達(dá)到目的了,可是這個(gè)sortByKey的確切含義究竟是什么,倒序?正序?能不能自定義排序原則?去找一下spark的api文檔吧,找到RDD類,查找sortByKey方法,可是,居然,居然沒有,只有sortBy,沒有sortByKey。懵逼了~~~~~~

直到我了解了implicit這回事,并且在RDD的源碼當(dāng)中我們找到了下面這段:

  implicit def rddToOrderedRDDFunctions[K : Ordering : ClassTag, V: ClassTag](rdd: RDD[(K, V)])
    : OrderedRDDFunctions[K, V, (K, V)] = {
    new OrderedRDDFunctions[K, V, (K, V)](rdd)
  }

上面我們對(duì)scala的implicit做了比較全面的了解,這樣的工作,對(duì)scala和spark的學(xué)習(xí)和理解,非常重要。

但是,我要說但是,凡事都有其兩面性,implicit在帶來代碼的緊湊和精煉的同時(shí),負(fù)作用就是可讀性極差;特別是在工作的初級(jí)階段,我是強(qiáng)烈不建議我們團(tuán)隊(duì)內(nèi)部大量的使用implicit。在我看來,多寫兩行代碼,顯式的轉(zhuǎn)換一下,真的不是什么大事!

上述內(nèi)容就是如何進(jìn)行scala隱式轉(zhuǎn)換及Spark源碼解析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站標(biāo)題:如何進(jìn)行scala隱式轉(zhuǎn)換及Spark源碼解析
文章網(wǎng)址:http://aaarwkj.com/article22/pjcsjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站收錄網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈自適應(yīng)網(wǎng)站、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
东京热男人的天堂色狠爱| 欧美大片黄片在线观看| 国产精品免费视频一区二区三区| 国产在线乱码一区二区| 久久久精品免费中文视频| 日韩黄色资源在线观看| 久久精品欧美日韩视频| 精品一区二区视频在线观看网站| 国产av网站精品成人| 色噜噜噜欧美人妻色综合| 免费在线黄色生活大片| 国产亚洲综合久久系列| 国产三级在线视频不卡| 九七青青草视频在线观看| 日本免费精品一区二区三区中| 黄色录像一级大片中国的| 亚洲天堂一区二区av| 中文字幕在线看二区不卡| 国产在线91精品入口| 日韩黄色资源在线观看| 国产亚洲精品热视频在线观看| 日韩精品专区在线影院重磅 | 天天操天天射夜夜爽| 视频一区二区三区不卡| 国产欧美日韩一区二区三区不卡 | 亚洲国产日韩欧美综合久久| 亚洲成av人片又粗又长| 免费观看黄片视频在线观看| 国产三级视频在线观看视频| 欧美精品黑人三级精品| 日韩一二三四区精品电影免费播放| 欧美久久精品在线观看| 国产精品欧美一区二区视频| 亚洲中文字幕在线乱码| 激情四射五月天亚洲婷婷| 国产女人高潮流白丝视频| 免费在线免费观看av| 国产精品不卡一不卡二| 色婷婷中文字幕久久久| 中文字幕伦理一区二区| 99精品国产高清一区二区三区|