Scala學習筆記

Scala學習筆記

1

scala program
var capital = Map(
“US” -> “Washington”,
“France” -> “Paris”
)

capital += (“Japan” ->“Tokyo”)
println(capital(“France”))

2

是什麼讓Scala具有可擴展性?
可擴展性受到從語法細節到控件的抽象構造等許多因素的影響,
Scala的可擴展性:面向對象和函數式編程的組合

3

函數式編程的兩種指導思想:
第一種理念:函數是頭等值。在函數式語言中,函數也是值,與整數或字符串處於同一個地位。
函數可以被當做參數傳遞給其他函數,可以當做結果從函數中返回或保存在變量中。
第二種理念:程序的操作應該吧輸入值映射爲輸出值而不是就地修改數據。
函數式編程第二種理念的另一種解釋:方法不應該有任何副作用(side effect).
方法與其所在環境交流的唯一方式應該是獲得參數和返回結果。
函數式語言鼓勵使用不可變數據結構和指明透明的方法。

4

Scala特點:
函數是頭等結構
兼容性
簡介
高層抽象
高級的敬愛類型化

5

變量定義
Scala有兩種變量,val和var。val類似於Java中的final變量。一旦初始化,
val就不能再被賦值。相反,var如同Java中的非final變量,可以在它的
生命週期中被多次賦值。

6

可以把 <- 符號理解爲“其中”,如 for(arg <- args) 就讀做“對於args中的arg”

7

Scala根本沒有傳統意義上的操作符,取而代之的是諸如+,-,*,/這樣的字符,可以用來做方法名。
例如:1+2,實際是在Int對象1上調用名爲+的方法,並把2當做參數傳給它,即(1).+(2)

8

Scala中儘管數組在實例化之後長度固定,但它的元素值是可變的,所以說數組是可變的。
Scala中列表類(List)是不可變的同類對象序列。
Lst列表操作有::和:::等。
list.head list.tail list.last
list.mkString(",") list.reverse
list.sort((s,t) =>
s.charAt(0).toLowerCase < t…charAt(0).toLowerCase
)

9

Scala中的元組(Tuple)和列表一樣,也是不可變的。但與列表不同,元組中可以包含不同類型的元素。
如果需要在方法裏返回多個對象,Java裏的做法是創建JavaBean可以包含多個返回值,Scala裏可以僅
返回元組。而且做起來也很簡單:只要把元組實例化需要的對象放在括號裏,並用逗號分隔即可。元組實
例化之後,可以用點號、下劃線和基於1的索引訪問其中的元素。

10

Set
var scalaSet = (“Beijing”,“Shenzhen”)
scalaSet += “Hangzhou”
scalaSet.+= (“Guangzhou”)
scalaSet = scalaSet + “Shanghai”

11

scala的任何object都能調用 -> 方法,並返回包含鍵值對的二元組
任何object都能調用 -> 的機制被稱爲隱式轉換
val normalMap = scala.collection.mutable.Map(1 -> “goodera”,2 -> “lin”)
normalMap.+= (3 -> “love”)
normalMap += (4 -> “forever”)
normalMap(5) = (“wonderful”)

12

如果代碼包含了任何var變量,那麼它可能就是指令式的風格。如果代碼根本就沒有var,即僅僅包含val,
那麼它或許是函數式風格。因此,向函數式風格轉變的方式之一,就是嘗試不用任何var編程。

13

在Scala裏把成員公開的方法是不顯式地指定任何訪問修飾符,public是scala的默認訪問級別

14

Scala比Java更爲面向對象的特點之一是Scala不能定義靜態成員,而是代之以定義單例對象。單例對象除了用
object關鍵字替換class關鍵字以外,看上去和類的定義一致。
當單例對象與某個類共享同一個名稱時,它被稱爲這個類的伴生對象(companion object)。類和它的伴生對象必須定義在一個
源文件裏,類被稱爲是這個單例對象的伴生類(companion class)。類和它的伴生對象可以互相訪問其私有成員。

15

Scala中的基本數據類型都可以寫成字面量(literal),字面量就是直接寫在代碼裏的常量值。
例如:val name = “goodera”

16

符號 + 是操作符,更確切地說,是中綴操作符
Scala裏的操作符不是特殊的語法,任何方法都可以是操作符,到底是方法還是操作符取決於你任何使用它。例如:s.indexOf(‘o’),indexOf就不是操作符,
但如果寫成 s indexOf ‘o’,那麼indexOf就是操作符。

17

先決條件require()

class Rational(m:Int,n:Int){
require( n != 0)

}
require方法帶一個布爾型參數,如果傳入的值爲真,require將正常返回。反之,require將拋出
IllegalArgumentExeception阻止對象被創建。

18

關鍵字this指向當前執行方法被調用的對象實例,或者如果使用在構造器裏的話,就是正在被構造的對象實例。
例如:
def lessThan(that:Rational)=this.number * that.denom < that.number * this.denom
這裏,this.number指向lessThan被調用的那個對象的分子。也可以去掉this前綴而只寫number,兩種寫法意義相同。
下面是不能省略this的例子,在Rational類裏添加max方法返回指定有理數和參數中的較大者:
def max(that:Rational) = {
if (this.lessThan(that)) that else this
}
這裏,第一個this可寫可不寫,寫成(lessThan(that))也是一樣的,但第二個this表示當測試爲假的時候的方法結果,
如果省略,什麼都返回不了。

19

Scala內建的控制結構屈指可數,僅有if、while、for、try、match和函數調用而已,能夠產生值。

20

發生器(generator)
file <- filename 被稱爲發生器(generator)的語法,可以實現遍歷功能
發生器中可以添加過濾器,如果添加超過一個過濾器,if子句必須用分號分隔。
eg:
for(
file <- filename
if file.isFile;
if file.getName.endsWith(".scala")
) println(file)
如果願意的話,可以使用花括號代替小括號包裹發生器和過濾器。使用花括號的好處是可以省略使用小括號時必須添加的分號。

21

匹配(match)表達式
scala的match表達式類似於其他語言中的switch語句,可以提供多個備選項。

val firstArg = if(!args.isEmpty) arg(0) else “”
方式一:
val firstEnd = firstArg math {
case “salt” => “pepper”
case “chips” => “sala”
case “eggs” => “bacon”
case _ => “others”
}
println(firstEnd)
方式二:
firstArg match {
case “salt” => println(“pepper”)
case “chips” => println(“sala”)
case “eggs” => println(“bacon”)
case _ => println(“others”)
}

22

不再使用break和continue

23

變量範圍
Scala程序裏所有的變量定義都存在有效作用範圍(scope)。。最常見的情況如,花括號通常引入看看新的作用範圍,
所以任何定義在花括號裏的東西超出括號之後就脫離了範圍。
例如:val a = 1
{
val a = 2
println(a)
}
println(a)

24

函數
val f = (_ : Int) + (_ : Int)
數據輸出方式:
someNumber.foreach(println)
someNumber.foreach(println )
someNumber.foreach(println(
))
someNumber.foreach(e => println(e))

25

將函數傳遞給一個變量
def sum(a:Int,b:Int,c:Int) = a + b + c
val aa = sum _
a(2,4,6)
分析:名爲a的變量指向一個函數值對象。這個函數值是由Scala編譯器
依照部分應用函數表達式sum _,自動產生的類的一個實例。編譯器產生的類
有一個apply方法帶3個參數,Scala編譯器把表達式a(2,4,6)翻譯成對函數值的
apply方法的調用,即a.apply(2,4,6)

26

Scala的任何方法調用,如果確實只傳入一個參數,就能可選地使用花括號替代小括號包圍參數。
例如:
println(“Hello World!”)
可以寫成:
println{“Hello World!”}
在傳入一個參數時,可以用花括號替代小括號的機制,其目的是讓客戶程序員能寫出包圍在花括號內的函數
字面量,這可以讓方法 調用感覺更像控制抽象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章