01.Scala快速入門
寫在最開始的話
其實在很久之前,我有自己學習過一些基於JVM的語言,包括Scala,Groovy,Bshell(不是linux中的shell,是最早的Sun公司出的bshell),但是在工作和日常生活中用不到之後,學習了又會忘記,不知道是不是記憶力不好的原因,但是此次公司決定使用Spark,準確的說是明年第二季度開始使用,所以我又開始整理關於Scala的知識,希望藉著這個機會能夠將Scala的語言特點整理,並且熟練掌握,應用於工作和日常開發之中。
關於Scala這門語言,其實語法量比Java多很多,很多老外建議我使用Clojure,不要使用Scala,他們給出最大的一個槽點就是語法太多,用他們的話講就是完成一件事,scala有太多的方式可供選擇,這樣反倒不太好,但是不管怎樣,既然要去使用這麼語言來餬口養家,那麼就自動遮蔽一些否定的聲音,也許他們說的有道理。
另外一個很重要的話題是,如果你掌握了Java 8,其中一些函數語言程式設計對知識,對學習Scala的幫助非常大,本人利用業餘的時間錄製了一套關於Java 8的視訊教程,大概有40集,全部是針對Java 8新語法和新程式設計思想的實戰,感興趣的可以去下載觀看
1、Scala快速入門
1.1 環境搭建
目前,最新版本的Scala是2.2.0,但是我本人使用的是2.10.3,JDK我使用的是1.8版本,編輯工具我使用的是Intellij Idea 15版本,讀者可以在該編輯器中安裝scala語言的外掛,但是在安裝外掛的時候需要注意一下,如果你通過Idea線上安裝的方式比較慢,你可以採用從本地磁碟進行安裝,下載外掛的地址為:
注意不要選擇錯誤的版本哈,否則就會出現相容性錯誤提示
1.2 快速入門
關於如何搭建環境,相信每一個計算機從業者,都沒有任何問題,即使出了問題,問問度娘也是很容易解決的,所以我們就不在這裡贅述了,直接來看看一些簡單的例子,讓大家快速上手Scala這門語言
1.2.1 定義變數
在Scala中有兩種變數,第一種是var,第二種是val,其中val類似於Java中的final,一旦定義就不允許改變,在Scala中的資料型別要比Java的稍微豐富一些,但是在這裡我們暫時不做過多的解釋,下面看一個簡單的例子,其中第一種定義和第二種定義是完全等價的,只不過前者利用了Scala的型別推導特性
//兩者完全等價 val i = 10 val i1:Int=10 val message="Hello World" val message1:String="Hello World" val message2:java.lang.String="Hello World" |
如果你對一個val宣告的變數嘗試修改,會出現錯誤。
1.2.2 定義函式
函式在任何語言中的地位都是舉足輕重的,尤其是在函數語言程式設計語言中,是絕對的一等公民,應此掌握如何定義函式,使用函式,是非常重要的,我們來看看scala是如何定義函式的
def max(x: Int, y: Int): Int = { if (x > y) return x else return y } def simpleMax(x:Int,y:Int)=if(x>y) x else y |
同樣我們採用了完整的寫法和比較簡潔的寫法,讓大家進行對比,看了這個函式的定義,我們來說說函式的結構
其中第二個省略了return語句和函式返回型別,甚至是花括號,那是因為scala是可以推匯出來他的返回型別。
我們再來看一個比較好玩的,這樣的特性在Java中是不具備的,函式定義如下所示
def returnAny(x: Int) = { if (x > 0) x * 10 else "I am a text" } |
該函式在x大於0時返回一個Int型別的數字,其他情況則返回一個字串,那麼他的返回值到底是什麼呢?答案是Any,這是Scala語言中的一個型別,我們在以後的文章中會繼續詳細解釋
1.2.3 編寫scala指令碼
Scala語言不僅可以使用scalac進行編譯後執行,還可以像shell一樣當作指令碼語言來執行,我們來看一個簡單的例子
def max(x:Int,y:Int):Int={ if(x>y) x else y } println("I will use my defined function for calculate.") val x = 10 val y = 20 val result = max(x,y) println("the max value is "+result+". between "+x+" and "+y) |
儲存為script.scala,然後使用命令scala script.scala去執行。
1.2.4 while迴圈
既然是快速入門,我們來簡單瞭解一下Scala中的迴圈,看下面的指令碼printargs.scala
var i = 0 while(i<args.length){ println(args(i)) i+=1 } |
執行命令之後會出現如下的結果
scala printargs.scala hello alex wangwenjun scala hello alex wangwenjun scala |
當然scala還有更好的做法處理這種情況,但是我們為了演示,暫時簡單的說一下,其實在Java 8 中,對待這種迴圈一個數組然後進行consume也是非常容易的,如果您瞭解Java 8的函數語言程式設計的話
1.2.5 scala中的foreach
在Scala中使用比較多的就是foreach了,在本節中我們來使用foreach完成上面的例子,並且對比一下Java 8是如何處理的
args.foreach((arg:String)=>println(arg)) println("=============================") args.foreach(arg=>println(arg)) println("=============================") args.foreach(println) |
這三句話的意思一某一樣,只不過越來越簡化了,在Java 8的函式式介面中,同樣可以寫的很簡潔,我們來看一下用Java 8的語法是如何完成的
Arrays.stream(args).forEach(System.out::println); |
Java 8 的一句話照樣也可以搞定一切,這也是Java 8 剛出來的時候很多人問Oracle的開發者,你們是不是想蠶食基於JVM的動態語言,尤其是Scala的原因了。
寫在最後的話
本節課的內容大概就這麼多,我們會逐步的更新,為了能夠讓讀者儘快看到最新的內容,沒更新一次就會發布一次,不用等到搞定一切之後再做統一發布,有問題可以和我交流,我們一起共同學習,共同進步,期待著你們的建議。