Scala 是一種有趣的語言。它一方面吸取繼承了多種語言中的優秀特性,一方面又沒有拋棄 Java 這個強大的平臺,它運行在 Java 虛擬機 (Java Virtual Machine) 之上,輕鬆實現和豐富的 Java 類庫互聯互通。它既支持面向對象的編程方式,又支持函數式編程。程序員
val x = 0 var y = 1 y = 2 // 給常量賦值會出現編譯錯誤 // x = 3 // 顯式指定變量類型 val x1: Int = 0 var y1: Int = 0
仔細觀察上述代碼,咱們會有兩個發現:編程
定義變量時沒有指定變量類型。這是否意味着 Scala 是和 Python 同樣的動態類型語言呢?偏偏相反,Scala 是嚴格意義上的靜態類型語言,因爲其採用了先進的類型推斷(Type Inference)技術,程序員不須要在寫程序時顯式指定類型,編譯器會根據上下文推斷出類型信息。好比變量 x
被賦值爲 0,0 是一個整型,因此 x
的類型被推斷出爲整型。固然,Scala 語言也容許顯示指定類型,如變量 x1
,y1
的定義。通常狀況下,咱們應儘可能使用 Scala 提供的類型推斷系統使代碼看上去更加簡潔。函數式編程
另外一個發現是程序語句結尾沒有分號,這也是 Scala 中約定俗成的編程習慣。大多數狀況下分號都是可省的,若是你須要將兩條語句寫在同一行,則須要用分號分開它們。函數
函數的定義也很是簡單,使用關鍵字 def
, 後跟函數名和參數列表,若是不是遞歸函數能夠選擇省略函數返回類型。Scala 還支持定義匿名函數,匿名函數由參數列表,箭頭鏈接符和函數體組成。函數在 Scala 中屬於一級對象,它能夠做爲參數傳遞給其餘函數,能夠做爲另外一個函數的返回值,或者賦給一個變量。在下面的示例代碼中,定義的匿名函數被賦給變量 cube
。匿名函數使用起來很是方便,好比 List
對象中的一些方法須要傳入一個簡單的函數做爲參數,咱們固然能夠定義一個函數,而後再傳給 List
對象中的方法,但使用匿名函數,程序看上去更加簡潔。spa
// 定義函數 def square(x: Int): Int = x * x // 若是不是遞歸函數,函數返回類型可省略 def sum_of_square(x: Int, y: Int) = square(x) + square(y) sum_of_square(2, 3) // 定義匿名函數 val cube = (x: Int) => x * x *x cube(3) // 使用匿名函數,返回列表中的正數 List(-2, -1, 0, 1, 2, 3).filter(x => x > 0)
讓咱們再來和 Java 中對應的函數定義語法比較一下。首先,函數體沒有像 Java 那樣放在 {}
裏。Scala 中的一條語句實際上是一個表達式,函數的執行過程就是對函數體內的表達式的求值過程,最後一條表達式的值就是函數的返回值。若是函數體只包含一條表達式,則能夠省略 {}
。其次,沒有顯示的 return
語句,最後一條表達式的值會自動返回給函數的調用者。scala
和 Java 不一樣,在 Scala 中,函數內部還能夠定義其餘函數。好比上面的程序中,若是用戶只對 sum_of_square 函數感興趣,則咱們能夠將 square 函數定義爲內部函數,實現細節的隱藏。code
def sum_of_square(x: Int, y: Int): Int = { def square(x: Int) = x * x square(x) + square(y) }
複雜一點的程序離不開流程控制語句,Scala 提供了用於條件判斷的 if else
和表示循環的 while
。和 Java 中對應的條件判斷語句不一樣,Scala 中的 if else
是一個表達式,根據條件的不一樣返回相應分支上的值。好比下面例子中求絕對值的程序,因爲 Scala 中的 if else
是一個表達式,因此不用像 Java 那樣顯式使用 return
返回相應的值。對象
def abs(n: Int): Int = if (n > 0) n else -n
和 Java 同樣,Scala 提供了用於循環的 while 語句,在下面的例子中,咱們將藉助 while 循環爲整數列表求和。繼承
def sum(xs: List[Int]) = { var total = 0 var index = 0 while (index < xs.size) { total += xs(index) index += 1 } total }
for(i <- 1 to 10) { println("i is " + i); } for(i <- 1 until 10) { println("i is " + i); }
Scala語言中的for循環有兩個關鍵字to和until。until和to的不一樣之處在於它不包括最後一個元素。上面代碼中的第一個循環會循環打印1到10包括10,而第二個循環打印1到9,不包含10。另外,scala在for循環中對循環變量i的賦值用了「<-」符號遞歸
區分大小寫 - Scala是大小寫敏感的,這意味着標識Hello 和 hello在Scala中會有不一樣的含義。
類名 - 對於全部的類名的第一個字母要大寫。
若是須要使用幾個單詞來構成一個類的名稱,每一個單詞的第一個字母要大寫。
示例:class MyFirstScalaClass
方法名稱 - 全部的方法名稱的第一個字母用小寫。
若是若干單詞被用於構成方法的名稱,則每一個單詞的第一個字母應大寫。
示例:def myMethodName()
程序文件名 - 程序文件的名稱應該與對象名稱徹底匹配。
保存文件時,應該保存它使用的對象名稱(記住Scala是區分大小寫),並追加「.scala」爲文件擴展名。 (若是文件名和對象名稱不匹配,程序將沒法編譯)。
示例: 假設「HelloWorld」是對象的名稱。那麼該文件應保存爲'HelloWorld.scala「
def main(args: Array[String]) - Scala程序從main()方法開始處理,這是每個Scala程序的強制程序入口部分。