scala隨筆之入門篇(一)
scala 簡介
- Java 方言之一,java的方言除了scala還有kotlin、groovy、clojure等。
- 執行在JVM之上
- scala和kotlin、groovy、clojure一樣是多正規化程式語言,支援函數語言程式設計
- scala常用領域是併發程式設計
- 大資料框架 spark是用scala實現的,play框架支援scala
- scala是靜態語言
- scala在國外的使用和學習環境,明顯好於國內。畢竟,tweet等知名網站是使用scala實現的。國內通過scala實現的,知名的網站沒有呢。
scala入門建議前置學習的內容
-
函數語言程式設計思維的學習
學習java的各種方言之前,都應該學習函數語言程式設計。適當的使用函數語言程式設計是減少程式碼量的同時,使程式碼邏輯更清晰的一個很重要的手段。而且,只有使用函式式並使用java方言提供的高階特徵,才能快速高效的完成程式設計任務。 -
java使用熟練
-
對java的多執行緒相關知識最好比較熟悉
學習筆記(1)
1.1字面量、值、變數、型別
- 字面量(literal)
這個概念,不太好理解。字面量就是指這個量本身,比如字面量3。也就是指3. 再比如 string型別的字面量"ABC", 這個"ABC" 通過字來描述。後面還是涉及到函式字面量等和字面量有關的概念。 - 值(value)
值是不可變的、有型別的儲存單元。可以在定義的時候指定資料,不能重新賦值
val a : Int = 1
- 變數(variable)
變數是可變的、有型別的儲存單元。可以重新賦值。
var b : boolean = true
b = false
- 型別
指所處理資料的種類
型別這一塊,和java差的不是很多,不過所有的型別並不是java的基礎型別。核心型別的都是以大寫字母開頭的(對,這些型別在java中本身就是一個類)
核心的資料型別有:Byte Short Int Long Float Double 等
Unit類是一個空型別,和java裡面的void
下圖是Scala型別層次體系
常用型別操作
操作名 | 示例 | 描述 |
---|---|---|
asInstanceOf[type ] |
5.asInstanceOf[Long] | 將一個型別的值轉換成指定型別的值 |
getClass | 7.getClass | 返回一個值的型別 |
isInstanceOf | (5.0).isInstanceOf[Float] | 如果這個值有給定的型別,則返回true |
hashCode | “A”.hashCode | 返回這個值的雜湊碼 |
to<type> |
20.toByte;47.toFloat | 型別轉換 |
toString | (3-5).toString | 轉換成字串 |
-
scala的型別定義是寫在
:
之後的,寫法和java有很大的區別。
下面是值a賦值的示例
val a : Int = 1
val宣告a這個變數是值,Int是變數a的型別。a的資料內容是1
下面是方法b的定義示例
def b(a:Int) : Int = a+1
方法b是一個加1函式,返回的是引數a+1的結果的一個函式。
def是定義這是一個方法,()裡面是引數a,型別Int,()之後的:後面,是定義函式的返回型別是Int,方法過程是a+1。scala的語法和java的很不一樣,因為本人先學了kotlin和groovy的,所以覺得scala的語法結果可能還好,沒有很習慣的感覺。
1.2 表示式和條件式
表示式
scala> 1 + 1
res0: Int = 2
res0是直譯器自動建立的變數名稱,用來指代表達式的計算結果。它是Int型別,值為2。
Scala中(幾乎)一切都是表示式。
程式碼塊
用大括號{}包裹起來的程式碼是程式碼塊。注意,scala裡面的{}和java裡面的{}在使用是,其實是有區別的。scala裡面的函式定義,並不是一定需要{}的,如果程式碼只有一條語句,或者寫在一行之類,那麼{}其實是可以省略的。下面是例子
def a:String = “hello world!”
def b():String = {"hello world!"}
例子中的兩個function,a和b,功能上是等效的,而且都是正確的寫法。
題外話,scala是出了名的難學,很大一個原因就是scala特別的自由。本人是非常喜歡scala的語法的,非常的靈活,沒有太多一定要遵守的格式,而且函式可以變得非常的簡潔。這個對提升開發效率是非常有用的一個點。而且,簡短的程式碼又非常有利於程式碼的review。
條件式
if…else表示式塊
scala的if else 和java的if else還是比較像的,但是scala的if…else不是語法結構塊,scala的if…else可以用在賦值表示式上面這點非常的重要,可以簡化程式碼
//這個表示式返回值是Unit,即空值。
var result = if(false) "when true return this"
java的等效程式碼
if(false){
String result = "when true return this";
}else{
String result = null;
}
這樣一對比,是不是覺得scala的程式碼簡潔太多了。
匹配表示式
match是scala裡面類似於java裡“switch”語句的存在,但是無論是scala的match還是kotlin裡面的when,都比java裡面的“switch”強大太多了。
這裡只講基本寫法,match的強大隻能在使用中去體會,很難很快說明match的強大之處
val a =1
val b=2
val big = a>b match{
case true : a
case false : b
}
匹配表示式有很多的使用技巧,包括模式替換、值繫結、模式哨位、指定模式變數。這些也都是scala語言,語法靈活的一個體現。
迴圈
scala支援的迴圈有for迴圈以及while和do/while迴圈
scala的for迴圈比起java也要簡潔很多。
下面是一個7次迴圈的例子
for (x <- 1 to 7 ) {println(s"Day $x")}
這個迴圈的結果就是列印如下內容
Day 1
Day 2
Day 3
Day 4
Day 5
Day 6
Day 7
很短對不對,i變數都省了。
下面基於這個,再介紹個神器的功能。
for (x <- 1 to 7 ) yield {s"Day $x:"}
這個表示式的結果是一個字串集合,沒有看錯,是個集合!!!