1. 程式人生 > >01.Scala快速入門

01.Scala快速入門

目錄 1

寫在最開始的話

其實在很久之前,我有自己學習過一些基於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的原因了。

寫在最後的話

本節課的內容大概就這麼多,我們會逐步的更新,為了能夠讓讀者儘快看到最新的內容,沒更新一次就會發布一次,不用等到搞定一切之後再做統一發布,有問題可以和我交流,我們一起共同學習,共同進步,期待著你們的建議。