教程 | 寫給Python程式設計師的Scala入門教程
隨著業務和資料的需要,我們引入了Spark
。Spark
對Python
的支援還是挺好的,但畢竟它還是使用Scala
開發的,且現有的API並沒有100%覆蓋Python。所以就有了這篇文章,讓Python程式設計師可以接觸Scala
這門更高(級)、更快(速)、更強(大)的(奧運精神)語言。
Scala兼具Python樣的開發效率,但又有Java般的執行效能,真是一不可多得的神器!(當然,魚和熊不可兼得,Scala的入門曲線相比Python是要那麼陡峭一丟丟)
一般Linux系統都自帶Python
環境,但Scala是沒有的。這需要我們手動安裝,還需要安裝Java環境。Java環境的安裝這裡就不介紹了,網上很多。說說Scala的安裝吧。下載地址在http://scala-lang.org/download/2.11.7.html。
1
|
wget -c http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz |
我們可以看到終端出現了scala>
提示符,這個就像Python
的REPL
一樣,Scala也擁有一個REPL
。我們可以在這裡很方便的編寫一些程式碼,測試一些想法。
對於Scala常用的IDE(整合開發環境),推薦使用IDEA for scala plugins和scala-ide
Scala的強大,除了它自身對多核程式設計更好的支援、函式式特性及一些基於Scala的第3方庫和框架(如:Akka、Playframework、Spark、Kafka……),還在於它可以無縫與Java結合。所有為Java開發的庫、框架都可以自然的融入Scala環境。當然,Scala也可以很方便的Java環境整合,比如:Spring。若你需要第3方庫的支援,可以使用Maven、Gradle、Sbt等編譯環境來引入。
Scala是一個面向物件的函式式特性程式語言,它繼承了Java的面向對特性,同時又從Haskell
那裡吸收了很多函式式特性並做了增強。
通常情況下,Java系的程式都需要有一個main方法來執行。並需要放入一個Web
container
容器,或打成一個jar
包來執行。但是Scala不一樣,它除了支援傳統的Java方式,它也可以像Python一樣把程式碼儲存到一個指令碼檔案裡(.scala)執行,就像一個Shell指令碼一樣。
1
|
yangjing-mac-air:scala-2.11.7 jingyang$ cat test.scala |
(注:需要把$SCALA_HOME/bin
加入系統環境變數才能直接執行scala
命令)
可以看到,使用Scala,你除了像傳統的Java程式一樣把它做為一個“服務”的方式來啟動,你也可以把它像Python一樣做為一個“指令碼”來啟動。
(注意:Scala不像Python一樣通過程式碼縮排來表示程式碼的層次關係,而是和通常的語言一樣使用{}
來表示程式碼的層級。給程式設計師更多的自由)
Scala中變數不需要顯示指定型別,但需要提前宣告。這可以避免很多名稱空間汙染問題。Scala有一個很強大的型別自動推導功能,它可以根據右值及上下文自動推匯出變數的型別。你可以通過如下方式來直接宣告並賦值。
1
|
scala> val a = 1 |
Immutable
(注:函數語言程式設計有一個很重要的特性:不可變性。Scala中除了變數的不可變性,它還定義了一套不可變集合scala.collection.immutable._
。)
val
代表這是一個final
variable,它是一個常量。定義後就不可以改變,相應的,使用var
定義的就是平常所見的變量了,是可以改變的。從終端的列印可以看出,Scala從右值自動推匯出了變數的型別。Scala可以如動態語言似的編寫程式碼,但又有靜態語言的編譯時檢查,不會像Python一樣留下很多陷阱在執行多時以後才被發現。
(注:在RELP
中,val
變數是可以重新賦值的,這是`RELP`的特性。在平常的程式碼中是不可以的。)
基礎資料型別
Scala中基礎資料型別有:Byte、Short、Int、Long、Float、Double,Boolean,Char、String。和Java不同的是,Scala中沒在區分原生型別和裝箱型別,如:int
和Integer
。它統一抽象成Int
型別,這樣在Scala中所有型別都是物件了。編譯器在編譯時將自動決定使用原生型別還是裝箱型別。
字串
Scala中單引號和雙引號包裹是有區別的,單引號用於字元,雙引號用於字串。
1
|
scala> val c1 = 'c' |
Scala基於JVM平臺,預設使用unicode,所以變數名是可以直接用中文的。而在Scala中,中文也是直接顯示的,不像Python2一樣會輸出成unicdoe編碼形式:\uxxxx。
Scala還支援String
Interpolation(“字串插值”)的特性,可以使用${variable
name}
這樣的形式引用變數,並將值插入。就像示例s2
一樣。
而連線3個雙引號在Scala中也有特殊含義,它代表被包裹的內容是原始字串,可以不需要字元轉碼。這一特性在定義正則表示式時很有優勢。
4運算子
Scala中的運算子其實是定義在物件上的方法(函式),你看到的諸如:3
+ 2
其實是這樣子的:3.+(2)
。+
符號是定義在Int
物件上的一個方法。支援和Java一至的運算子(方法):
(注:在Scala中,方法前的