如下是近期Scala學習過程當中的簡單記錄,因爲理解能力的問題,初期的東西可能會有很多疏漏和理解錯誤的地方,後期再逐漸改善。若是有不入高手法眼的地方也至關歡迎前來指正。另筆記順序沒什麼依據,徹底根據看書的進度來(書名是《Scala編程》)java
概念理解:
首先Scala鼓勵使用函數式的編程風格,這種風格我如今理解爲函數應該處理和本身相關的東西,而不關心以外的事件。即處理數據的函數只應該處理數據後返回結果,而某些返回結果的則應該專一於結果的展現。還有儘可能少的使用var編程
1、基本類型和操做符
1.基本類型
與Java相同,有Byte、Short、Int、Long、Char、String、Float、Double、Boolean,除String外,其他都爲Scala成員。使用時Scala社區推薦的風格是使用大寫開頭。
另外Scala中定義了一批基本類型的富包裝類,相似於Java中的包裝類,提供了一些經常使用的方法。但經過隱式轉換在使用上要方便很多,全部的scala基本類型都有對應的富包裝類,如RichByte、RichShort、RichInt、RichLong、RichChar、RichFloat、RichDouble、RichBoolean。
2.操做符
Scala中操做符分爲前置操做符(+、-、!、~,這些操做符也是函數,被定義爲unary_開頭的方法,例如unary_+)、中置操做符(全部只有一個參數的函數均可以做爲中置操做符,好比 "abc" indexOf "a",至關於調用"abc".indexOf("a"))、後置操做符(不帶任何參數的函數,好比 123 toString)
2、變量
scala中變量定義以var或val開頭,var用於聲明可變變量,val聲明不可變變量,相似於Java中的final。var變量可屢次進行從新賦值,val只能賦值一次
變量賦值,例如val a = 0;能夠沒加類型聲明,scala會自動推斷類型,也能夠手動的加類型聲明 val a:String = "abc"
。數組
3、函數
1.函數的定義
大部分和Java中的規範相同,不一樣之處是Scala中可使用像+、-這樣的函數名,例如1+2
實際調用的是1.+(2)
。
2.有返回值的函數
以def開頭後加函數名,例如 def fun(a:Int,b:String)={}
,有兩個參數,一個參數爲a類型爲Int,另外一個爲b類型爲String,後跟一個等號,在等號前能夠聲明函數的返回類型,一般狀況下不須要作聲明scala會根據函數體(花括號中的內容)的最後一行表達式的內容(即返回值)來推斷返回類型。Scala也會將函數體最後一行的表達式結果做爲函數返回值,而不須要手動的使用return返回。
3.沒有返回值的函數
若是函數沒有返回值,則能夠省略函數定義中的等號,返回值類型爲Unit(至關於Java中的void,但有些不一樣,具體的區別後面再講)。 例如 def fun() {println("a")}
函數
有一種狀況函數的返回類型的聲明則是必要的,即遞歸函數。
當函數體中只包含一個表達式時,則表達式外的花括號能夠省略, 例如:def test(a:Int,b:Int) = a + b
。還有Scala中語句結尾的分號是可省略的
3.好吧,還有一個是分號推斷,這個我實在不知道該放到哪一個分類下,就寫這兒吧!大意就是大多數正常換行寫代碼的狀況下是不須要寫分號的(固然寫了也能夠)。只有在如下一種狀況成立的條件下須要分號:
(1)疑問行由一個不能合法做爲語句結尾的字結束,如句點或中綴操做符(加、減、乘、除等)
(2)下一行開始於不能做爲語句開始的詞
(3)行結束於括號()或方框[]內部工具
4、類和對象
1.類的定義
使用class關鍵字,例如class test{}
。
2.類構造器
scala中類的構造器分兩種,一種是主構造器,一種是輔助構造器
主構造器定義於類的定義中。像class test(val name:String,val age:Int)
這樣,如同Java同樣當不定義主構造器時,會自動生成一個無參的主構造器。主構造器函數的範圍則在類名後的花括號中,例class test{//這裏即爲主構造器}
。也有別的規則以下:
主構造器中的參數 生成的字段、方法val/var name:String
私有name字段,生成公共的只讀或者可寫的方法private val/var name:String
私有name字段,生成私有的只讀或者可寫的方法@BeanProperty val/var name:String
同上,有些註解會生成額外Java版的公有的 geter和seter方法name:String
若是有方法中使用此參數,則生成字段,等同於 private[this] val name,不然無此字段
輔助構造器
輔助構造器的名稱爲this,輔助構造器中必須調用其它的輔助構造器或者是主構造器。
3.單例對象
scala中不能定義靜態成員,而使用單例對象,單例對象的定義使用object關鍵字,且沒有參數,其他的和類一致。當單例對應與某個類名稱相同時,稱這個單例對象是某個類的伴生對象,且類的伴生對象必須與類定義在同一個文件中。類和它的伴生對象能夠相互訪問之間的私有成員。且單例對象第一次被訪問時纔會被初始化
與類不一樣名的單例對象叫獨立對象,可看成工具類或程序的入口使用
5、控制結構
1.if表達式
語法和Java相同,不一樣的地方是scala的if語句是有返回值的,例如val res = if(1=2) 1 else 2
。
2.while循環
這個和java沒什麼不一樣的,且並不會有返回值。因爲沒有返回值while循環的做用一般是更改某個var的值或者執行I/O操做。因此在可能的狀況下並不太建議使用while循環
3.for循環
for循環在scala中有着比較強大的功能。下面逐一介紹
(1)枚舉集合類for(a <- List(1,2,3))
此例中<-操做符至關於Java中加強for循環中的:操做符。但不須要聲明a的類型,scala會推斷類型
(2)過濾
scala的for循環中能夠過濾循環的集合,經過條件守衛只循環其中的某一部分,示例以下:for(a <- 0 to 10 if(a % 2 == 0))
,也能夠添加多個條件守衛,守衛之間用分號隔開,不過當使用花括號時能夠省略分號學習
/*使用小括號時須要加分號*/ for(a <- 0 to 10 if(a != 1);if(a != 2)) /*使用花括號時多個條件守衛能夠省略分號*/ for{a <- 0 to 10 if(a != 1) if(a != 2) }
(3)嵌套枚舉
循環條件中能夠加入多個循環,每一個循環均可以帶本身的條件守衛。好比this
for(a <- 0 to 10 if(a % 2 == 0) b <- 0 to 10 if(b % 2) != 0)
(4)流間變量綁定scala
/** trimmed被定義在第二個循環中,且在第二個條件漂守衛和循環體中使用,屬於代碼簡化方式*/ for{ file <- filesHere if file.getName.endsWith(".scala") line <- fileLines(file) trimmed = line.trim if trimmed.matches(pattern) } println(file + ": " + trimmed)
(5)創造新集合
scala中的for循環可使每次循環結果以集合的方式返回,使用的關鍵字爲yield,示例以下:code
Array arr = Array(1,2,3,4,5,6,7,8,9) /** 此循環產生的結果是一個只包含偶數的數組,返回的集合類型與循環時遍歷的集合類型一致, 須要注意的地方是yield關鍵字應當放到循環體以外,也就是若是循環體有花括號時yield關鍵字 應當放在循環體的花括號以前,for(//循環條件) yield {//循環體}*/ for(a <- arr if(a % 2 == 0)) yield a
4.異常處理
(1)拋出異常
語法和Java的相同,throw new RuntimeException()
但在scala中拋出異常的語句是有返回值的,返回值類型爲Noting,是全部類型的子類。具體的之後講,如今只先大概瞭解一下。
(2)捕獲異常
使用scala中的一種叫模式匹配的方式進行異常捕獲。語法以下,好像也沒啥可說的。finally子句也和Java中的相同。不一樣之處是try catch語句也有返回值的。還有最好別在finally子句中使用return返回結果,不然這個返回結果會覆蓋以前的正常try中的結果。對象
try{ val f = new FileReader("test.txt") }catch{ case ex:FileNotFoundException => //處理文件丟失 case ex:IOException => //處理IO問題 }finally{ }
5.變量範圍,這個裏惟一不太同樣的地方是,scala中容許嵌套範圍裏定義同名變量,例如:
var a =1 { var a = 2 { //此處打印2 println(a) } }