Scala快速安裝及基本語法
阿新 • • 發佈:2018-11-03
作者:林偉兵,叩丁狼高階講師。本文為原創文章,轉載請註明出處。
1. Scala概述
什麼是Scala
Scala是一種多正規化的程式語言,其設計的初衷是要整合面向物件程式設計和函數語言程式設計的各種特性。Scala運行於Java平臺(Java虛擬機器),並**相容Java程式**。
為什麼要學Scala
-
優雅:這是框架設計師第一個要考慮的問題,框架的使用者是應用開發程式設計師,API是否優雅直接影響使用者體驗。
-
編寫速度快:Scala語言表達能力強,一行程式碼抵得上Java多行,開發速度快;Scala是靜態編譯的,所以和JRuby,Groovy比起來速度會快很多。
-
能融合到Hadoop生態圈:Hadoop現在是大資料事實標準,Spark並不是要取代Hadoop,而是要完善Hadoop生態。JVM語言大部分可能會想到Java,但Java做出來的API太醜,或者想實現一個優雅的API太費勁。
Scala環境安裝
訪問Scala官網https://www.scala-lang.org/download/2.11.12.html下載Scala編譯器安裝包,目前最新版本是2.12.x,但是目前大多數的框架都是用2.11.x編寫開發的,所以這裡推薦2.11.x版本,根據不同的平臺選擇不同的版本進行下載。這裡以scala-2.11.12為例 。
在windows上直接使用msi 軟體進行安裝即可; 在 linux 中直接下載壓縮包,解壓並配置環境變數:
export JAVA_HOME=/usr/java/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin:/usr/java/scala-2.10.6/bin
安裝成功後,可以通過shell視窗啟動scala命令列,如下圖:
學習scala除了可以使用命令列的方式,還可以使用整合工具,常見的整合工具有:
在intellij中可以新增 scala外掛來實現(具體需要百度下外網下載的解決方案):
安裝外掛後啟動 Intellij 並嘗試建立一個簡單的scala專案:
執行如下程式(如果建立不成功,可能是因為關聯scala的安裝包失敗):
//相當於java 的 class
object Helloworld {
//定義了一個main方法
def main(args: Array[String]): Unit = {
//嘗試輸出列印一個hello...
println("hello scala")
}
}
2. Scala 的基本型別
Scala和Java一樣,有7種數值型別Byte、Char、Short、Int、Long、Float和Double(無包裝型別)和一個Boolean型別,除了上面的基本型別 還有一個型別叫做Unit,對應的是Java的void。
上面的基本型別的父類叫做 AnyVal , 如果是一個scala物件/java物件,其父類就是 AnyRef。所有的資料型別的總父類是 Any。如下圖:
基本型別的常見使用方式:
基本型別的轉換和判斷
scala> var height:Float = 1.75f
height: Float = 1.75
判斷某個變數的型別
scala> height.isInstanceOf[Float]
res0: Boolean = true
強制轉換 將一個型別轉化為另一個型別
scala> height.asInstanceOf[Double]
res1: Double = 1.75
字串的操作
3. Scala 流程語句
3.1 if… else … 語句
scala 的判斷語句與 java的判斷語句用法差不多。但是比java的判斷語句多了一個賦值的功能。案例2可以將判斷語句的結果賦值給tipStr。
對於判斷語句的賦值問題有2點要注意的:
- 在if/else的程式碼塊中最後一個值作為才能作為返回值,並且返回值不能攜帶return。
- 如果if/else的程式碼塊中的返回值不是同個型別,就需要要在返回值中指定返回的父類的型別(不指定的話系統會通過型別推導來實現)。
3.2 while語句
scala> var(index,sum) = (100,0)
index: Int = 100
sum: Int = 0
scala> while(index>0){
| sum+=index
| index=index-1
| }
scala> println("sum="+sum)
sum=5050
3.3 for 迴圈
對於陣列集合的工具,一般有:
這兩種方式的建立是一樣的,都是建立一個數字集合,範圍從startIndex到endIndex
scala> 1.to(3)
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)
scala> 1 to 3
res1: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)
對於Range的建立,其範圍從從startIndex到endIndex-1
scala> Range(1,3)
res2: scala.collection.immutable.Range = Range(1, 2)
我們也可以通過until來建立一個range。其範圍從從startIndex到endIndex-1
scala> 1 until 5
res3: scala.collection.immutable.Range = Range(1, 2, 3, 4)
對於Range,我們還可以設定步長
scala> Range(1,10,2)
res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
scala> Range(1,10,0)
java.lang.IllegalArgumentException: step cannot be 0.
at scala.collection.immutable.Range.<init>(Range.scala:86)
at scala.collection.immutable.Range$.apply(Range.scala:439)
... 32 elided
scala> Range(10,1,-1)
res4: scala.collection.immutable.Range = Range(10, 9, 8, 7, 6, 5, 4, 3, 2)
對於for迴圈,還支援雙重迴圈和if判斷的巢狀。
在遍歷的過程中,還能根據yeild關鍵字來收集符合條件的元素,如下案例:
對於集合的for迴圈,我們還可以使用下面的語句來實現:
scala> Array("Hadoop","Spark","Storm").foreach(ele => println(ele))
Hadoop
Spark
Storm
3.4 switch語句