1. 程式人生 > >scala隨筆之入門篇(一)

scala隨筆之入門篇(一)

scala 簡介

  1. Java 方言之一,java的方言除了scala還有kotlin、groovy、clojure等。
  2. 執行在JVM之上
  3. scala和kotlin、groovy、clojure一樣是多正規化程式語言,支援函數語言程式設計
  4. scala常用領域是併發程式設計
  5. 大資料框架 spark是用scala實現的,play框架支援scala
  6. scala是靜態語言
  7. 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
    類似。Unit的字面量是(),空的小括號,沒有任何內容。

下圖是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:"}

這個表示式的結果是一個字串集合,沒有看錯,是個集合!!!