Scala基礎-01-Scala環境安裝及基礎語法(變數,函式)
Scala簡介
Scala是一種多正規化的程式語言,其設計的初衷是要整合面向物件程式設計和函數語言程式設計的各種特性。Scala運行於Java平臺(Java虛擬機器),併兼容現有的Java程式。Scala是編寫大資料框架Spark的語言,隨著大資料的興起,越來越多的人開始學習Scala
Scala語言的優點
優雅:這是框架設計師第一個要考慮的問題,框架的使用者是應用開發程式設計師,API是否優雅直接影響使用者體驗。
速度快:Scala語言表達能力強,一行程式碼抵得上Java多行,開發速度快;Scala是靜態編譯的,所以和JRuby,Groovy比起來速度會快很多。
能融合到Hadoop生態圈:Hadoop現在是大資料事實標準,Spark並不是要取代Hadoop,而是要完善Hadoop生態。JVM語言大部分可能會想到Java,但Java做出來的API太醜,或者想實現一個優雅的API太費勁。
Scala環境安裝
1.安裝JDK
Scala是執行在Java虛擬機器JVM上的一種程式語言,所以安裝Scala編譯器前要先安裝JDK
2.安裝Scala編譯器
開啟Scala官網,進入Download頁面
由於現有的Spark專案一般都用的比較成熟的Scala2.10.x版本,所以為了方便日後學習Spark,我選擇了下載較老的2.10版本,在Other Releases中選擇2.10版
Windows使用者可以選擇.msi字尾的檔案來安裝Scala,可以一鍵安裝不用自己手動配置環境變數
IDEA安裝Scala外掛
安裝完Scala編譯器後還需要給IDE安裝對應的外掛才能使用Scala,我是用的IDE是IDEA
開啟IDEA外掛頁,File->Setting->Plugins,搜尋Scala,下載安裝,如果速度太慢,也可以自己去Jetbrains外掛官網下載然後採用本地安裝
Jetbrains官網的Scala外掛版本
紅圈中選項進行本地安裝
一.Scala變數
Scala是強型別語言,和Java一樣,有7種數值型別Byte、Char、Short、Int、Long、Float和Double(無包裝型別)和一個Boolean型別
Scala變數的定義
Scala編譯器會自動推斷變數的型別(和Python一樣),也可以指定型別
有兩種方法定義變數,val和var,val定義的變數是不可變的,相當於java中的final修飾(比java簡潔太多),var定義的變數是可變的,使用中儘可能多使用val定義變數
object VariableDemo {
def main(args: Array[String]) {
//定義常量
val i = 1
//定義變數
var s = "hello"
//自己指定變數型別,不指定Scala編譯器會自動推斷變數的型別
val str: String = "itcast"
}
}
二.Scala表示式
Java中的各種控制語句在Scala中都簡化為表示式,包括條件表示式,迴圈表示式等。Scala表示式都有返回值,scala中有個Unit類,寫做(),相當於Java中的void
2.1 條件表示式
Scala條件表示式的一般形式:
//如果x>A,則將A賦值給a變數,否則將B賦值給a變數
val a = if (x > A) A else B
條件表示式的其他使用示例:
object ConditionDemo {
def main(args: Array[String]) {
val x = 1
//判斷x的值,將結果賦給y
val y = if (x > 0) 1 else -1
println(y)
//支援混合型別表示式,即可以返回不同型別的變數值
val z = if (x > 1) 1 else "error"
println(z)
//預設else,相當於if (x > 2) 1 else ()
val m = if (x > 2) 1
println(m)
//執行結果和上式一樣
val n = if (x > 2) 1 else ()
println(n)
//if和else if
val k = if (x < 0) 0
else if (x >= 1) 1 else -1
println(k)
}
}
2.2 塊表示式
在Scala中使用{ }來構成一個塊表示式,塊表示式中可包含數量不等的表示式,塊的值是塊中最後一個表示式的值,塊表示式示例:
def main(args: Array[String]) {
val x = 0
//將塊表示式的值賦給result
val result = {
if (x < 0){
-1
} else if(x >= 1) {
1
} else {
"error"
}
}
print(result)
}
2.3 迴圈語句
Scala中可以用while和for兩種方式實現迴圈,但大多場景會用更靈活的for迴圈
2.3.1 普通for迴圈
for迴圈的格式:
A表示被遍歷的物件,可以是表示式,陣列或集合
for (i <- A)
//for迴圈中的執行語句需要比for表示式退一個tab(和Python一樣)
print(i)
object ForDemo {
def main(args: Array[String]) {
//被遍歷體是表示式
//表示式1 to 10表示一個Range(區間),用來產生隨機數
for (i <- 1 to 10)
println(i)
//被遍歷體是陣列
val arr = Array("a", "b", "c")
for (i <- arr)
println(i)
}
}
2.3.2 高階for迴圈
for迴圈表示式可以很複雜,被迴圈體可以是一個生成器,生成器可以帶一個條件
object ForDemo {
def main(args: Array[String]) {
//注意:if前面沒有分號
for(i <- 1 to 3; j <- 1 to 3 if i != j)
print((10 * i + j) + " ")
}
}
2.3.3 for推導式
如果for迴圈的迴圈體以yield開始,則該迴圈會構建出一個集合
object ForDemo {
def main(args: Array[String]) {
//每次迭代生成集合中的一個值
val v = for (i <- 1 to 10) yield i * 10
println(v)
}
}
三.Scala中的方法和函式
3.1 Scala方法
3.1.1 方法的定義
下式從左到右各部分含義分別為:使用def關鍵字定義方法,方法名稱為method1,引數為x,y,均為Int型別,方法返回值為Int型,方法的方法體為x*y
def method1(x: Int, y: Int) : Int = x*y
3.1.2 方法的返回值
方法的返回值型別可以不寫,編譯器可以自動推斷出來,但是遞迴函式必須指定返回型別
3.1.3 方法在Scala中的應用
Scala中的操作符本質都是一個方法,如+ - * / % & | ^ >> <<
等操作符,底層都是用方法實現的
如a + b
是a.+(b)
的簡寫,a + b
本質上是a呼叫了一個名稱為“+”的方法,方法引數為b
所以,a.方法(b)
可以簡寫成 a 方法 b
3.2 Scala函式
3.2.1 函式的定義
定義名稱為function1的函式,返回值為val型別變數,引數為x,y,均為Int型別,方法的方法體為x*y
val function1 = (x: Int, y: Int) => x*y
3.3 Scala方法和函式的相互轉化
將方法轉化為函式:
//只需要在方法名後加下劃線“_”
val funtion1 = methon1 _