中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala隱式轉換的用法

發布時間:2021-09-16 22:16:10 來源:億速云 閱讀:154 作者:chen 欄目:大數據

本篇內容介紹了“scala隱式轉換的用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一,簡介

從類型S到類型T的隱式轉換由具有函數類型S => T的隱式值定義,或者通過可轉換為該類型的值的隱式方法來定義。隱含轉換適用于兩種情況:

1),如果表達式e是類型S,并且S不符合表達式的期望類型T.

2),在具有類型S的e的e.m表達中,如果m不表示S的成員

在第一種情況下,搜索適用于e并且其結果類型符合T的轉換c。在第二種情況下,搜索適用于e的轉換c,其結果包含名為m的成員。

列表[Int]的兩個列表xs和ys的以下操作是合法的:

xs <= ys

前提是下面定義的隱式方法list2ordered和int2ordered在范圍內:

implicit def list2ordered[A](x: List[A])(implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =new Ordered[List[A]] { /* .. */ }
implicit def int2ordered(x: Int): Ordered[Int] =new Ordered[Int] { /* .. */ }

隱式導入的對象scala.Predef聲明了一些預定義的類型(例如Pair)和方法(例如,assert),還有一些隱式轉換。例如,當調用期望java.lang.Integer的Java方法時,可以自由地傳遞一個scala.Int。這是因為Predef包含以下隱式轉換:

import scala.language.implicitConversions
implicit def int2Integer(x: Int) =java.lang.Integer.valueOf(x)

因為隱式轉換可能有缺陷,如果不加區別地使用,編譯器在編譯隱式轉換定義時會發出警告。

若要關閉警告,請采取以下任何一種操作:

1),將scala.language.implicitConversions導入隱式轉換定義的范圍

2),調用編譯器時,加上:-language:implicitConversions

當編譯器應用轉換時,不會發出警告。

二,demo

1,第一種情況的demo

直接使用,會報錯

val i: Int = 1.5

定義隱式轉化方法

implicit def double2Int(d: Double) = d.toInt

再次執行就正常了

scala隱式轉換的用法

2,第二種情況的demo

class MYDF{  def  show(sw : String) = println(sw)}object RDD2DF{  implicit def rdd2df(s : MYRDD) = new MYDF}class MYRDDobject AminalType extends  App{  import yourpackage.RDD2DF._  val test = new MYRDD  test.show("RDD converts into DF")         }

編譯器在執行test 對象的時候并沒有show方法,此時編譯器就會在作用域范圍內查找能使其編譯通過的隱式視圖,找到RDD2DF的隱式轉換方法后,會先進行隱式轉換,之后調用show方法。

3,隱式轉化參數

在定義一個方法時可以把最后一個參數列表定義為隱式參數。這個在spark內部使用也是非常廣泛,比如前面發表的文章spark累加器原理,自定義累加器及陷阱就用到了。

如果方法有多個隱式參數,只需一個implicit修飾即可。當調用包含隱式參數的方法是,如果當前上下文中有合適的隱式值,則編譯器會自動為改組參數填充合適的值。如果沒有編譯器會拋出異常。當然,標記為隱式參數的我們也可以手動為該參數添加默認值。

def foo(n: Int)(implicit t1: String, t2: Double = 3.14)。

 少了第一步會報錯。

scala隱式轉換的用法

此種情況在Spark中的使用,舉例:

def accumulator[T](initialValue: T, name: String)(implicit param: AccumulatorParam[T])  : Accumulator[T] = {  val acc = new Accumulator(initialValue, param, Some(name))  cleaner.foreach(_.registerAccumulatorForCleanup(acc))  acc}

三,總結

徹底搞懂scala隱式轉換,對我們了解spark及spark相關產品源碼,如mongodbredis等于spark結合實現源碼原理有著至關重要的作用。

“scala隱式轉換的用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临洮县| 千阳县| 津南区| 桂林市| 白银市| 策勒县| 搜索| 兰西县| 南昌县| 仙居县| 马尔康县| 增城市| 榆社县| 隆昌县| 台中县| 高要市| 马关县| 密山市| 佛冈县| 乌恰县| 宁河县| 连江县| 咸宁市| 大邑县| 江北区| 班玛县| 旬邑县| 云龙县| 东方市| 鄂州市| 诸城市| 长葛市| 郎溪县| 东海县| 临漳县| 报价| 红原县| 兴城市| 女性| 莱州市| 莎车县|