Scala快速入門

jopen 9年前發布 | 70K 次閱讀 Scala 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中的變量有兩種varval(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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!