1. 程式人生 > >教程 | 寫給Python程式設計師的Scala入門教程

教程 | 寫給Python程式設計師的Scala入門教程

統計網導讀 本文從安裝、基礎資料型別、運算子、函式等七個方面系統介紹了Scala的語言特性。不僅是Python程式設計師,任何有程式設計經驗或者希望入門的人都可以看看,對Scala做一個基礎的認識。

隨著業務和資料的需要,我們引入了SparkSparkPython的支援還是挺好的,但畢竟它還是使用Scala開發的,且現有的API並沒有100%覆蓋Python。所以就有了這篇文章,讓Python程式設計師可以接觸Scala這門更高(級)、更快(速)、更強(大)的(奧運精神)語言。

Scala兼具Python樣的開發效率,但又有Java般的執行效能,真是一不可多得的神器!(當然,魚和熊不可兼得,Scala的入門曲線相比Python是要那麼陡峭一丟丟)

1安裝

一般Linux系統都自帶Python環境,但Scala是沒有的。這需要我們手動安裝,還需要安裝Java環境。Java環境的安裝這裡就不介紹了,網上很多。說說Scala的安裝吧。下載地址在http://scala-lang.org/download/2.11.7.html

1
2
3
4
5
6
7
8
9
wget -c http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
tar zxf scala-2.11.7
cd scala-2.11.7
./bin/scala
Welcome to Scala version
2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).

Type in expressions to have them evaluated.
Type :help for more information.

scala>

我們可以看到終端出現了scala>提示符,這個就像PythonREPL一樣,Scala也擁有一個REPL。我們可以在這裡很方便的編寫一些程式碼,測試一些想法。

對於Scala常用的IDE(整合開發環境),推薦使用IDEA for scala pluginsscala-ide

Scala的強大,除了它自身對多核程式設計更好的支援、函式式特性及一些基於Scala的第3方庫和框架(如:Akka、Playframework、Spark、Kafka……),還在於它可以無縫與Java結合。所有為Java開發的庫、框架都可以自然的融入Scala環境。當然,Scala也可以很方便的Java環境整合,比如:Spring。若你需要第3方庫的支援,可以使用MavenGradleSbt等編譯環境來引入。

Scala是一個面向物件的函式式特性程式語言,它繼承了Java的面向對特性,同時又從Haskell那裡吸收了很多函式式特性並做了增強。

2Hello, world.

通常情況下,Java系的程式都需要有一個main方法來執行。並需要放入一個Web container容器,或打成一個jar包來執行。但是Scala不一樣,它除了支援傳統的Java方式,它也可以像Python一樣把程式碼儲存到一個指令碼檔案裡(.scala)執行,就像一個Shell指令碼一樣。

1
2
3
4
5
6
7
8
yangjing-mac-air:scala-2.11.7 jingyang$ cat test.scala 
#!/bin/sh
exec scala "$0" "[email protected]"
!#
// Say hello to the first argument
println("Hello, "+ args(0) +"!")
yangjing-mac-air:scala-2.11.7 jingyang$ ./test.scala 楊景
Hello, 楊景!

(注:需要把$SCALA_HOME/bin加入系統環境變數才能直接執行scala命令)

可以看到,使用Scala,你除了像傳統的Java程式一樣把它做為一個“服務”的方式來啟動,你也可以把它像Python一樣做為一個“指令碼”來啟動。

(注意:Scala不像Python一樣通過程式碼縮排來表示程式碼的層次關係,而是和通常的語言一樣使用{}來表示程式碼的層級。給程式設計師更多的自由)

3變數、基礎資料型別

Scala中變數不需要顯示指定型別,但需要提前宣告。這可以避免很多名稱空間汙染問題。Scala有一個很強大的型別自動推導功能,它可以根據右值及上下文自動推匯出變數的型別。你可以通過如下方式來直接宣告並賦值。

1
2
3
4
5
6
7
8
9
10
11
scala> val a = 1
a: Int = 1

scala> val b = true
b: Boolean = true

scala> val c = 1.0
c: Double = 1.0

scala> val a = 30 + "歲"
a: String = 30

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中沒在區分原生型別和裝箱型別,如:intInteger。它統一抽象成Int型別,這樣在Scala中所有型別都是物件了。編譯器在編譯時將自動決定使用原生型別還是裝箱型別。

字串

Scala中單引號和雙引號包裹是有區別的,單引號用於字元,雙引號用於字串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
scala> val c1 = 'c'
c1: Char = c

scala> val 字元2 = '楊'
字元2: Char = 楊

scala> val s1 = "杭州譽存科技有限公司"
s1: String = 杭州譽存科技有限公司

scala> val s2 = s"杭州譽存科技有限公司工程師${c2}景"
s2: String = 杭州譽存科技有限公司工程師楊景

scala> val s3 = s"""杭州譽存科技有限公司"工程師"\n${c2}景是江津人"""
s3: String =
杭州譽存科技有限公司"工程師"
楊景是江津人

Scala基於JVM平臺,預設使用unicode,所以變數名是可以直接用中文的。而在Scala中,中文也是直接顯示的,不像Python2一樣會輸出成unicdoe編碼形式:\uxxxx。

Scala還支援String Interpolation(“字串插值”)的特性,可以使用${variable name}這樣的形式引用變數,並將值插入。就像示例s2一樣。

而連線3個雙引號在Scala中也有特殊含義,它代表被包裹的內容是原始字串,可以不需要字元轉碼。這一特性在定義正則表示式時很有優勢。

4運算子

Scala中的運算子其實是定義在物件上的方法(函式),你看到的諸如:3 + 2其實是這樣子的:3.+(2)+符號是定義在Int物件上的一個方法。支援和Java一至的運算子(方法):

(注:在Scala中,方法前的