Scala快速入門
當面向對象遇到函數式編程,這就是Scala。簡練的語言描述與簡單的例子相輔相成,希望能夠對大家學習Scala有所幫助。
定義
Scala語言是一種面向對象語言,同時又結合了命令式(imperative)和函數式(functional)編程風格。官網描述:Object-Oriented Meets Functional(面向對象遇到函數式編程)。
安裝
下載地址http://www.scala-lang.org/download/
當前版本2.11.4
設置環境變量
export SCALA_HOME=/home/mupeng/Hadoop/scala-2.11.4 export PATH=$SCALA_HOME/bin:$PATH
如果是修改的profile,執行source /etc/profile,使環境變量立即生效。
檢測安裝是否成功命令 scala -version,如果出現以下內容,證明安裝成功。
scala -version Scala code runner version 2.11.4 -- Copyright 2002-2013, LAMP/EPFL
Scala解釋器
直接輸入scala,就進入scala解釋器
scala Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35). Type in expressions to have them evaluated. Type :help for more information.
先來兩個例子,熟悉以下scala解釋器
scala> 1+2 res0: Int = 3
res0表示執行結果,Int指結果類型,3指計算結果
scala> println("hello scala") hello scala
輸出hello scala
變量
Scala中的變量有兩種var和val(val類似于Java中final,值不可改變)
scala> var hello = "hello world"
hello: String = hello world
scala可以根據賦值內容推算出變量類型。Scala中的數據類型都是對象。
函數
Scala是面向對象語言同時也是函數式編程語言,因此函數在Scala語言中的地位同對象、變量一樣。使用scala函數注意一下幾點:
1) 函數參數寫在類型之前,中間用逗號隔開;
def helloScala = { println("Hello Scala!") }
2) 函數都有返回結果,無需使用return,函數內最后一個表達式作為返回結果返回。helloScala函數的返回類型為Unit,表示該函數不返回任何有意義的值(相當于Java中的void)。
3) 函數參數可以給定默認值。
def hello(name : String = "Scala") : String = { return "Hello : " + name }
4) 函數的參數都是val類型,執行過程中不能被改變。(函數式編程的特點,只計算結果,不改變參數)
5) 定義方法還有如下方式
def add = (x : Int, y : Int) => x + y
打印結果print(add(1, 2));
def add2(x : Int)(y : Int) = x + y
打印結果print(add2(1)(2))
循環
在了解循環之前,我們先要知道Scala不支持i++和++i,需要使用i+=1來實現加一。
while循環
var i=0 while (i < args.length) { println (args(i)) i+=1 }
for循環
for (arg <-args) println(arg)
for參數里面同樣支持if判斷,比如輸出1——10中的偶數
for (i <- 1 to 10 if i % 2 == 0) println(i)
foreach
args.foreach(arg => println(arg))
因為參數只有一個,表達式也只有一個,可以簡寫為
args.foreach(println)
Array與List
創建數組有兩種方式
val greetStrings = new Array[String](3) greetStrings(0) = "Hello" greetStrings(1) = ", " greetStrings(2) = "world!\n"
或者
val numNames = Array("zero", "one", "two")
注意與Java不同的是:數組的第零個元素是greetStrings(0),不是greetStrings[0]。
Array長度不可變,但是它的值可變。
List長度與值都不可變。
val list1 = List(1, 2) val list2 = List(3, 4) val list3 = list1 ::: list2 //list3結果為(1,2,3,4) val list4 = 0 :: list3 //list4結果為(0,1,2,3,4)
這里有兩個操作 ::: 連接兩個List
:: 右操作符,將一個新元素放到List的最前端。
類與對象
1. 定義類
class Person { var email = "abc123@126.com" // 變量,var聲明會生成getter和setter方法 var name : String = _ // 變量, _起到占位符的作用 val age = 10; // 常變量,val聲明只會生成getter private val gender = "male" //只能在類內部使用 }
缺省訪問級別是public,一個源文件中可以有多個class,都是public的。
2. 主構造器
class Student(var name : String, val number : String) { println("主構造器!") }
??1)主構造器直接跟在類名后面,主構造器的參數最后會被編譯成字段。??
2)主構造器執行的時候,會執行類中所有的語句。
??3)如果主構造器參數聲明時候不加val或者var,就相當于private??????
3. 從構造器
class Student(var name : String, val number : String) { println("主構造器!") var gender : String = _ def this(name : String, number : String, gender : String) { this(name, number) this.gender = gender } }
1)從構造器定義在類內部,方法名為this
2)從構造器必須先調用已經存在的構造器
4. 繼承:繼承而來的字段不需要加var或者val
class UniversityStudent(name : String, number : String, val major : String) extends Student(name, number) { ...... }
注意:重寫父類的字段或方法要在前面加上override關鍵字
5. 抽象類(abstract class)與特質(trait)
1)抽象方法不需要加關鍵字,只有聲明,沒有具體實現。
2)可以聲明抽象字段,也就是沒有初始值。
3)子類重寫父類的抽象方法或者抽象字段,不需要加override
trait特質可以理解為可以有具體實現方法的接口,類可以通過with關鍵字混入(mix-in)特質,同時它的對象也可以混入特質。
Scala程序的執行入口是提供main方法的獨立單例對象。同樣也可以給一個單例對象混入App特質,去繼承App特質中的main方法.
6. apply方法
1)對象的apply方法
class ApplyTest { println("Test") }object ApplyTest { def apply() = new ApplyTest }
// 調用方法 val a = ApplyTest() // 類名+括號,調用對象的apply方法</pre>
上面例子中一個調用apply方法,生成一個新的對象。(絕大多數apply方法都是這樣去用)
apply方法就是Scala提供的一個語法糖,對象的apply方法在scala里面非常常用
例如:
val arr = Array(1, 2, 3)實際調用的是
val arr = Array.apply(1, 2, 3)</pre>
以下是Array對象的apply方法源碼
object Array extends FallbackArrayBuilding {... /* Creates an array of
Int
objects / // Subject to a compiler optimization in Cleanup, see above. def apply(x: Int, xs: Int*): Array[Int] = { val array = new ArrayInt array(0) = x var i = 1 for (x <- xs.iterator) { array(i) = x; i += 1 } array } ...}</pre>
2)類的apply方法
class ApplyTest { def apply() { println("APPLY Method") } println("Test") }val a = new ApplyTest a() // 對象名+括號,調用類的apply方法</pre>
7.單例
用object替換class,其它的跟定義類類似。
當單例對象與類共享同一個名字時,該對象稱作類的伴生對象。
與Java對比
如果用作服務器端開發,Scala的簡潔、靈活性是Java無法比擬的;如果是企業級應用開發、Web開發,Java的強大是Scala無法匹敵的。我們不用一種語言的優勢去抨擊另一種語言的短板,所以不要說Java與Scala孰優孰劣,更不要說誰將要取代誰,二者本來就是互補關系。
總結
scala語言的知識點有太多太多,在一篇博客中不可能做到一一列舉。本文只是列舉了常用的的幾點,希望對正在學習scala的人有所幫助。
相關博文:Scala快速排序的實現分分鐘掌握快速排序
來自:http://my.oschina.net/mup/blog/363436