Continuous Updating...
第一部分近弟,入門(mén)
-
變量聲明:var缅糟,val,lazy val
- var聲明可變變量祷愉;val聲明不可變變量窗宦。推薦使用val。
- lazy val惰性賦值:在變量調(diào)用時(shí)執(zhí)行賦值二鳄,賦值后值不可變赴涵。
- 編譯器自動(dòng)推斷類型,無(wú)需顯示指明變量類型订讼。
-
函數(shù)定義:val髓窜,def
- val定義函數(shù)變量。
- 無(wú)需顯示return欺殿,默認(rèn)最后一行為返回結(jié)果
-
字符串
- "hello world"
- 保存字符串格式
""" {
attr1: hello,
attr2: world
} """
-
控制結(jié)構(gòu): if else, for, while, try ... catch
沒(méi)有寄纵?:,只有if else
if else有返回值
for
for {
i ← list
if(i % 2 == 0)
} println(i)try ... catch
try {
...
} catch {
case e1: Exception =>
case e2: Exception =>
}
-
模式匹配:match...case
- 表達(dá)式脖苏,有返回值程拭;
- 匹配上即跳出,全部未匹配throw error
- 搭配case class
-
類
- class C(arg: Int)
- class C(var arg: Int)
- class C(val arg: Int)
- class C(private val arg: Int)
- abstract class
使用val聲明的變量不能通過(guò)=
重新賦值
-
object
- 單例
- 伴生對(duì)象
- 對(duì)象的構(gòu)建
-
樣本類:case class
- 自帶apply棍潘,unapply
- sealed武裝
- 搭配模式匹配
-
trait
- 功能更強(qiáng)大的接口
特質(zhì)相較與接口和抽象類功能更為強(qiáng)大恃鞋,而且特質(zhì)可以保證抽象的粒度更小一下。當(dāng)明確了繼承關(guān)系時(shí)使用抽象類亦歉,但只是抽象某一特性時(shí)要使用特質(zhì)恤浪。
- 功能更強(qiáng)大的接口
-
集合
- List
- head,tail
- Nil
- 提洒⒒铡:val List(head, tail) = List(1, 2, 3)
- Seq
- Map
- Array
- Set
- List
-
集合操作
- map
- foreach
- flatMap
- fold
- reduce
- filter
-
數(shù)據(jù)結(jié)構(gòu)
-
Option
- say good-bye to null
- 支持集合操作
-
Tuple
- (t1, t2), t1 -> t2
- Map(t1 -> t2)
- 兩元素集合
-
Either
- 左error资锰,右result
-
-
Template String
- s"${hello}, ${firstName + lastName}"
-
import
- 位置:文件頭,文件中阶祭,方法中
- 全部引用 import package._绷杜,單個(gè)引用import package.c1
-
App特質(zhì)
- 啟動(dòng)程序
-
重復(fù)參數(shù)
- def fn(i: Int*)
- fn(1, 2, 3)
- fn(1, 2, 3:_*)
二,進(jìn)階
-
并發(fā)集合
- List(1, 2, 3, 4).par
-
懶集合濒募、視圖
- Stream
- 遞歸數(shù)據(jù)結(jié)構(gòu)
- 延遲計(jì)算
- 拿多少給多少
- View
- 延遲計(jì)算
- 合并復(fù)雜計(jì)算
- Stream
-
map/reduce/fold/flatMap
- 假設(shè)我們有一筐蘋(píng)果鞭盟,fold操作就好像是我們要把這個(gè)框子中的蘋(píng)果打成果醬,我們從框中把蘋(píng)果一個(gè)一個(gè)取出來(lái)扔到機(jī)器中瑰剃,最后得到了一灘果醬齿诉;
- map操作就好像我們要給每個(gè)蘋(píng)果套一個(gè)包裝袋,每套完一個(gè)扔到另外的框中晌姚,最后得到了一筐帶包裝的蘋(píng)果粤剧。
Actor
- message-driven
- stateful
- 最小并發(fā)單元promise和future
-
第一等函數(shù)
-
閉包
- 函數(shù)字面量在運(yùn)行時(shí)創(chuàng)建的函數(shù)值稱為閉包。
- 自由變量挥唠,綁定變量抵恋。
其實(shí)就是根據(jù)上下文對(duì)自由變量賦值的過(guò)程。
-
偏應(yīng)用
- 偏函數(shù)只對(duì)其定義域的一部分做處理宝磨。
- 對(duì)于一個(gè)函數(shù)弧关,只提供其部分(或者不)參數(shù),就構(gòu)成一個(gè)偏應(yīng)用函數(shù)唤锉。
- 偏應(yīng)用函數(shù)是函數(shù)
-
賦值/傳遞
- 函數(shù)可以隨意用來(lái)賦值和傳遞
-
高階函數(shù)
- def f2(f: ()=>Unit) { f() }
-
匿名函數(shù)
- f2(() => println("hello")) //匿名函數(shù)
-
尾遞歸
- 遞歸不再可怕
尾遞歸和遞歸不一樣的是世囊,Scala編譯器檢測(cè)到尾遞歸就用新值更新函數(shù)參數(shù),然后把它替換成一個(gè)回到函數(shù)開(kāi)頭的跳轉(zhuǎn)窿祥。相當(dāng)與一次新的函數(shù)調(diào)用株憾。-
柯里化
- 柯里化是把多參函數(shù)轉(zhuǎn)化為單個(gè)參數(shù)逐一調(diào)用的方式。
類型參數(shù)
型變
抽取器
依賴注入
trait
三晒衩,進(jìn)階
隱式轉(zhuǎn)換
類型系統(tǒng)
類型類
duck type
type lambada
TypeTag
Functor号胚,Monad
Combinator parsers