Scala隱式轉換入門實踐

2020-10-16 軟體架構

隱式轉換(Implicit Conversion)是Scala語言提供的一個強大的語法特性,是學習Scala必須要掌握的技能。

一、Scala提供的隱式轉換函數

Scala的隱式轉換無處不在。在實際開發過程中,常常會自動地使用隱式轉換。

比如,在for循環中構造循環語句:

其實是方法調用,即1.to(5),但Int類型並沒有to方法,在執行時會自動進行隱式轉換,將Int類型轉換為scala.runtime.RichInt類型。

def to(end : scala.Int) : scala.collection.immutable.Range.Inclusive = { /* compiled code */ }


Int類型到RichInt類型的轉換定義在scal.LowPriorityImplicits 類中,可以通過如下的命令查看:

scala> :implicit -v

正是這些隱式轉換函數的存在,簡化了Scala程序代碼,使代碼更加簡潔。


二、自定義隱式轉換函數

在特定條件下,會自動調用Scala提供的隱式轉換函數來完成隱式轉換,但是Scala提供的隱式轉換函數畢竟是有限的。下面我們自己定義一個簡單的隱式轉換函數。

看一個示例:

package implicitconversion


import scala.collection.immutable.StringOps


object ImplicitTest {

def plus(a:Int, b:Int)={

a+b

}


def main(args: Array[String]): Unit = {

println(plus(1,2))

}

}

輸出結果為:3

但是,如果我們想讓字符串「1」和字符串「2」相加呢:

println(plus("1","2"))

就會出現如下錯誤:type mismatch-類型不匹配。


我們定義一個隱式函數做一個隱式轉換:

implicit def str2Int(x:String):Int = new StringOps(x).toInt

直接把String轉換為Int類型。

再次執行:println(plus("1","2"))

就工作正常了。編譯器發現傳入參數的類型與plus方法定義的類型不匹配,就會在當前作用域範圍內查找能夠將字符串String轉換成Int類型的隱式轉換函數。代碼中定義隱式轉換函數:str2Int(x:String):Int 正好滿足要求。


在IDEA 編輯器中,打開Implicit conversions提示【快捷鍵:Ctrl + Alt + Shift + 「+」】,如圖所示,可以看到自動調用了隱私轉換函數。

關閉Implicit conversions 提示的快捷鍵:Ctrl + Alt + Shift + 「-」

需要注意:如果在當前作用域範圍存在函數籤名相同,但函數名稱不同的兩個隱式轉換函數,則在進行隱式轉換時會報錯。

有興趣,可以再定義一個Double轉換成Int類的隱式轉換函數。


三、隱式參數和隱式值

使用implicit關鍵字修改函數參數,這種形式的參數為隱式參數。

scala> def person(implicit name : String) = name //name為隱式參數

此時,直接調用person方法,編譯器說無法為參數name找到一個隱式值。


定義一個隱式值後再調用person方法:

scala> implicit val p="jack"

p: String = jack

scala> person

res5: String = jack

將變量p標記為 implicit,編譯器會在方法省略隱式參數的情況下,去搜索作用域內的隱式值作為參數傳入。


如果此時我們再定義一個隱式變量,調用方法時就會報錯:ambiguous implicit values。


隱式轉換必須滿足無歧義規則,在聲明隱式參數的類型是最好使用特別的或自定義的數據類型,不要使用Int、String這些常用類型,避免碰巧匹配。

(此處已添加圈子卡片,請到今日頭條客戶端查看)

相關焦點

  • Scala對於大數據開發重要嗎?Scala基礎學習建議
    對於大數據開發工程師,建議掌握的Scala基礎如下:1、scala特性,包括面向對象特性、函數式編程、靜態類型、擴展性和並發性。2、表達式,在scala中一切皆為表達式,理解表達式是理解其語法的前提。3、方法與函數,了解兩者之間的區別和轉換。4、模式匹配,了解常用的幾種模式。
  • Scala基礎學習十之模式匹配了解
    對類型進行匹配運行結果對Array和List元素進行匹配對case class進行匹配對有值或沒值進行匹配(Option)元組scala泛型基本和Java一樣,區別在於:Java使用表示泛型,scala使用[]表示泛型泛型可以出現在class名稱後面以及方法名稱後面class Student[T]def add[T](t:T)上下界:
  • SQL優化案例(1):隱式轉換
    而在SQL調優的場景中,一類比較常見的問題,就是隱式類型轉換。那什麼是隱式轉換呢?在MySQL中,當操作符與不同類型的操作數一起使用時,會發生類型轉換以使操作數兼容,此時則會發生隱式轉換。出現隱式轉換,往往意味著SQL的執行效率將大幅降低。
  • 記住這個,能少走彎路,C++兩種隱式類型轉換
    本文將要講解的C++兩種隱式類型轉換,如果不了解其用法,那麼遇到問題的時候,可能就會陷入困境。所以接下來就來講解operator與構造函數的隱式類型轉換,首先通過例子說明operator的隱式類型轉換,再說明構造函數的隱式類型轉換,最後再總結它們之間的區別。
  • 隱式類型轉換初解
    ​前端1.0-顯示類型轉換再想要了解隱式類型轉換前,我們先要了解一下顯示類型轉換,顯示類型轉換:Number() : 轉換為數字類型ParseInt() : 轉換為整型parseFloat() : 轉換為浮點型toString() : 轉換為字符串類型String() : 轉換為字符串類型Boolean() :轉換為布爾類型以上就是一些顯示類型轉換的方法,使用這些方法,可以將其它類型的數據轉換成想要的數據類型,比如 Number(&34;) , 結果為123,Number方法將字符串類型
  • 給商戶多付款,元兇竟然是Mysql資料庫隱式轉換
    最後定位到,原來是有一個OA工單,修改金額的sql語句出現的問題,因為隱式轉換,多更新了一條記錄。在這裡,很多人就不明白,一個隱式轉換怎麼就多更新了生產上記錄。下面來做一下復盤。3.隱式轉是元兇下面來仔細分析一下select id from t_test where c=83868641912;欄位C是char字符串類型,而83868641912卻是整數,在mysql裡,兩個變量一起比較時,必須類型是一致的,由於83868641912是整數,於是mysql特別智能,人性化的將欄位C也轉換成整數
  • 大數據分析工程師面試集錦2-Scala
    舉例說明下集合之間是很容易相互轉換的,根據具體的需要調用相應的方法進行轉換,如:toList、toMap、toSet。_這裡引入的是scala與java集合的隱式轉換,就不需要特意進行asJava和asScala的轉換,直接使用Java或者Scala的方法。
  • 分布式計算框架之Flink入門
    上遊可對接實時(實時事件流)和離線(db/文件/kv存儲格式)形式的數據流,經過Flink框架的轉換處理,再流向下遊的應用系統、新的實時事件流或數據存儲(db/文件/kv存儲格式)。正確性保證,支持Exactly-once(精確一次)語義、Event-time processing(實踐時間處理)、Sophisticated late data handling(複雜延遲數據處理)等功能機制。
  • scala學習筆記(一)
    1、scala入門準備工作學習環境我是這樣搭建的首先選擇ubuntu linux 14.04然後安裝\ -v 本地目錄:/scala \ -it index.alauda.cn/ttch/scala bash可以看到進入了一個bash console下。
  • Scala之伴生類與伴生對象
    Scala應用特點在大數據開發中,scala程式語言應用廣泛,Spark計算引擎底層就是使用scala語言編寫的,因此使用scala編寫Spark程序非常方便。下面是一個計算WordCount的例子:val result = textRDD.map(row => row.replace(",", ""))//去除文字中的,防止出現歧義 .flatMap(row => row.split(" "))//把字符串轉換為字符集合 .map(row => (row
  • Scala學習手冊(Learning Scala)第四章習題
    scala> def area(r:Double):Double = r*r*3.14area: (r: Double)Doublescala> area(5)res30: Double = 78.5也可以使用math.pow(r,2)來計算平方2、對練習1中的函數提供一個替代形式,將半徑作為一個String,如果調用這個函數時提供了一個空String
  • Scala 文件 I/O
    scalaTest.scala $ scala Test$ cat test.txt 菜鳥教程從屏幕上讀取用戶輸入有時候我們需要接收用戶在屏幕輸入的指令來處理程序。實例如下:import scala.io.
  • All 必碼系列 | Power BI最佳實踐的十大秘密武器(第3部分)
    那麼,讓我們從前5個最佳實踐技巧開始第3部分。提示1 用顯式度量,不是隱式度量簡而言之,隱式度量是自動為匯總分配的度量,例如Power BI的Sum或Count。當我們將數據提取到Power BI中時,默認情況下,所有可以匯總的數字列,都是隱式度量。
  • 有趣的 Scala 語言:簡潔的 Scala 語法
    上面這行代碼:先通過 map 操作將List[Int] 轉化成 List[String],也就是把列表中的每個元素從 Int 類型轉換成作為腳本執行:我們可以將 Scala 表達式寫在一個文件裡,比如 Hello.scala。在命令行中直接輸入 scala Hello.scala就可得到程序運行結果。Hello.scala 代碼:println("Hello Rickie!
  • 編寫高質量代碼的50條黃金守則-Day 01(首選隱式類型轉換)
    編寫高質量代碼的50條黃金守則-Day 01(首選隱式類型轉換),本文由比特飛原創發布,轉載務必在文章開頭附帶連結:https://www.byteflying.com/archives/6455該系列文章由比特飛原創發布,計劃用半年時間寫完全50篇文章,為大家提供編寫高質量代碼的一般準則。
  • Scala語言基礎:中綴表示法
    scala> val books=Map(1->"Scala", 2->"Spark", 3->"Flink", 4->"Elasticsearch")scala> books
  • Eclipse創建第一個Scala項目
    安裝JDK,我已經安裝好了,如果不會安裝搜索之前的文檔《Win10+Java1.8環境搭建(圖解教程)》安裝Maven,我已經安裝好了,如果不會安裝搜索之前的文檔《Eclipse配置Maven3.5》SCALA安裝解壓scala壓縮包
  • Spark集群:環境搭建之Scala安裝指南!
    如下圖所示:從上圖看到安裝Spark2.1.2我們需要安裝scala2.11.x版,在scala官網可以找到與之對應的是2.11.12。scala運行對java虛擬機也是有要求的,從下圖可以看到2.11.12要求java1.8的環境。大家還記得我們虛擬機中安裝的java版本嗎?
  • PySpark源碼解析,用Python調用高效Scala接口,搞定大規模數據分析
    同時,Python 語言的入門門檻也顯著低於 Scala。為此,Spark 推出了 PySpark,在 Spark 框架上提供一套 Python 的接口,方便廣大數據科學家使用。在 Spark 編譯用戶的 DAG 的時候,Catalyst Optimizer 會創建 BatchEvalPython 或者 ArrowEvalPython 這樣的 Logical Operator,隨後會被轉換成 PythonEvals 這個 Physical Operator。
  • C語言的隱式類型轉換和顯示類型轉換
    類型轉換的方式,一般可分為隱式類型轉換和顯示類型轉換(也稱為強制類型轉換)。1、隱式類型轉換隱式類型轉換由編譯器自動進行,不需要程式設計師幹預。隱式類型轉換通常有兩種情況:賦值轉換和運算轉換。賦值轉換:將一種類型的數據賦值給另外一種類型的變量時,發生隱式類型轉換。