Scala解釋器的使用 ·REPL:Read(取值)-> Evaluation(求值)-> Print(列印)-> Loop(迴圈)。scala解釋器也被稱為REPL,會快速編譯scala代碼為位元組碼,然後交給JVM來執行。 ·計算表達式:在scala>命令行內,鍵入scala代碼,解釋器會直接返回 ...
Scala解釋器的使用
·REPL:Read(取值)-> Evaluation(求值)-> Print(列印)-> Loop(迴圈)。scala解釋器也被稱為REPL,會快速編譯scala代碼為位元組碼,然後交給JVM來執行。
·計算表達式:在scala>命令行內,鍵入scala代碼,解釋器會直接返回結果給你。如果你沒有指定變數來存放這個值,那麼值預設的名稱為res,而且會顯示結果的數據類型,比如Int、Double、String等等。
·例如,輸入1 + 1,會看到res0: Int = 2
·內置變數:在後面可以繼續使用res這個變數,以及它存放的值。
·例如,2.0 * res0,返回res1: Double = 4.0
·例如,"Hi, " + res0,返回res2: String = Hi, 2
·自動補全:在scala>命令行內,可以使用Tab鍵進行自動補全。
·例如,輸入res2.to,敲擊Tab鍵,解釋器會顯示出以下選項,toCharArray,toLowerCase,toString,toUpperCase。因為此時無法判定你需要補全的是哪一個,因此會提供給你所有的選項。
·例如,輸入res2.toU,敲擊Tab鍵,直接會給你補全為res2.toUpperCase。
Scala聲明變數
val 代表常量
val a=100;
var 代表變數
var a=100;
·聲明val變數:可以聲明val變數來存放表達式的計算結果。
·例如,val result = 1 + 1
·後續這些常量是可以繼續使用的,例如,2 * result
·但是常量聲明後,是無法改變它的值的,例如,result = 1,會返回error: reassignment to val的錯誤信息。
·聲明var變數:如果要聲明值可以改變的引用,可以使用var變數。
·例如,val myresult = 1,myresult = 2
·但是在scala程式中,通常建議使用val,也就是常量,因此比如類似於spark的大型複雜系統中,需要大量的網路傳輸數據,如果使用var,可能會擔心值被錯誤的更改。
·在Java的大型複雜系統的設計和開發中,也使用了類似的特性,我們通常會將傳遞給其他模塊 / 組件 / 服務的對象,設計成不可變類(Immutable Class)。在裡面也會使用java的常量定義,比如final,阻止變數的值被改變。從而提高系統的健壯性(robust,魯棒性),和安全性。
·指定類型:無論聲明val變數,還是聲明var變數,都可以手動指定其類型,如果不指定的話,scala會自動根據值,進行類型的推斷。
·例如,val name: String = null
·例如,val name: Any = "leo"
·聲明多個變數:可以將多個變數放在一起進行聲明。
·例如,val name1, name2:String = null
·例如,val num1, num2 = 100
Scala數據類型與操作符
·基本數據類型:Byte、Char、Short、Int、Long、Float、Double、Boolean。
·乍一看與Java的基本數據類型的包裝類型相同,但是scala沒有基本數據類型與包裝類型的概念,統一都是類。scala自己會負責基本數據類型和引用類型的轉換操作。
·使用以上類型,直接就可以調用大量的函數,例如,1.toString(),1.to(10)。
·類型的加強版類型:scala使用很多加強類給數據類型增加了上百種增強的功能或函數。
·例如,String類通過StringOps類增強了大量的函數,"Hello".intersect(" World")。
·例如,Scala還提供了RichInt、RichDouble、RichChar等類型,RichInt就提供了to函數,1.to(10),此處Int先隱式轉換為RichInt,然後再調用其to函數
·基本操作符:scala的算術操作符與java的算術操作符也沒有什麼區別,比如+、-、*、/、%等,以及&、|、^、>>、<<等。
·但是,在scala中,這些操作符其實是數據類型的函數,比如1 + 1,可以寫做1.+(1)
·例如,1.to(10),又可以寫做1 to 10
·scala中沒有提供++、--操作符,我們只能使用+和-,比如counter = 1,counter++是錯誤的,必須寫做counter += 1.
Scala 函數調用與apply()函數
·函數調用方式:在scala中,函數調用也很簡單。
·例如,import scala.math._,sqrt(2),pow(2, 4),min(3, Pi)。
·不同的一點是,如果調用函數時,不需要傳遞參數,則scala允許調用函數時省略括弧的,例如,"Hello World".distinct
·apply函數
·Scala中的apply函數是非常特殊的一種函數,在Scala的object中,可以聲明apply函數。而使用“類名()”的形式,其實就是“類名.apply()”的一種縮寫。通常使用這種方式來構造類的對象,而不是使用“new 類名()”的方式。
·例如,"Hello World"(6),因為在StringOps類中有def apply(n: Int): Char的函數定義,所以"Hello World"(6),實際上是"Hello World".apply(6)的縮寫。
·例如,Array(1, 2, 3, 4),實際上是用Array object的apply()函數來創建Array類的實例,也就是一個數組。