本書是為想要快速學(xué)習(xí)或者正在學(xué)習(xí)Scala編程語(yǔ)言的Java開發(fā)者寫的,循序漸進(jìn)地介紹了Scala編程語(yǔ)言的多個(gè)方面。
本書共分為4個(gè)部分:第一部分詳細(xì)介紹Scala的一些基礎(chǔ)知識(shí),并和Java中的相關(guān)概念進(jìn)行了參照,方便讀者快速上手Scala;第二部分進(jìn)一步介紹Scala的一些中級(jí)知識(shí),以及與Java的一些差異點(diǎn),方便讀者編寫出更簡(jiǎn)潔的代碼;第三部分介紹在Scala中如何進(jìn)行并發(fā)編程,并務(wù)實(shí)地介紹Akka套件;第四部分通過(guò)實(shí)戰(zhàn)練習(xí)對(duì)前面的知識(shí)進(jìn)行綜合應(yīng)用,并系統(tǒng)地介紹如何與Java進(jìn)行互操作。此外,附錄部分還包括一些額外指引。
本書的目標(biāo)讀者是對(duì)JVM平臺(tái)上的語(yǔ)言以及函數(shù)式編程感興趣的程序員。閱讀本書不需要讀者熟悉Scala編程語(yǔ)言,但需要讀者具備Java、面向?qū)ο缶幊痰谋尘爸R(shí)。因?yàn)楸緯砸环N非常務(wù)實(shí)的方式組織內(nèi)容,所以讀者無(wú)法學(xué)到Scala的所有內(nèi)容,但是足以應(yīng)付日常工作,如果想要更全面地學(xué)習(xí)Scala以及其背后的一些設(shè)計(jì)理念,則最好輔以其他圖書。
IT行業(yè)正擁抱函數(shù)式編程,但面向?qū)ο缶幊探?jīng)驗(yàn)仍然極富價(jià)值。Scala編程語(yǔ)言結(jié)合了面向?qū)ο缶幊毯秃瘮?shù)式編程這兩種編程范式的原力,而本書將展示如何有效地結(jié)合這兩者。
自本書首版出版以來(lái), Scala編程語(yǔ)言已經(jīng)取得了長(zhǎng)足的發(fā)展, 這一版在此基礎(chǔ)上也進(jìn)行了大幅更新。我們修訂了每一章,并添加了3章零6節(jié)的新內(nèi)容來(lái)探討Scala 2.12的新特性。讀者將學(xué)到如何使用并發(fā)集合和Akka的Actor來(lái)安全地管理并發(fā),使用值類和改進(jìn)后的隱式轉(zhuǎn)換來(lái)創(chuàng)建富有表現(xiàn)力和可讀性的代碼,使用字符串插值來(lái)從數(shù)據(jù)構(gòu)建字符串,創(chuàng)建領(lǐng)域特定語(yǔ)言,以及使用尾調(diào)用優(yōu)化來(lái)優(yōu)化遞歸。
無(wú)論讀者是要?jiǎng)?chuàng)建簡(jiǎn)潔、健壯的單線程應(yīng)用程序,還是要編寫非常具有表現(xiàn)力、線程安全的并發(fā)程序,本書都是讀者的良師益友。
作者簡(jiǎn)介
文卡特·蘇帕拉馬尼亞姆(Venkat Subramaniam)博士 Agile Developer公司的創(chuàng)始人,同時(shí)也在休斯敦大學(xué)兼任教職。他已經(jīng)培訓(xùn)和指導(dǎo)了數(shù)千名軟件開發(fā)者。他也是多本書籍的(合著)作者,其中包括獲得2007年度Jolt“生產(chǎn)力大”(Productivity Award)的《高效程序員的45個(gè)習(xí)慣:敏捷開發(fā)修煉之道》一書。
譯者簡(jiǎn)介
沈達(dá) 挖財(cái)大數(shù)據(jù)研發(fā)工程師, Scala 愛好者與實(shí)踐者, 專注于大數(shù)據(jù)和分布式系統(tǒng)。業(yè)余時(shí)間是GNU TeXmacs的貢獻(xiàn)者。
何品 目前是淘寶的一名知名軟件工程師,熱愛反應(yīng)式編程,同時(shí)也是Akka和Netty等項(xiàng)目的貢獻(xiàn)者,活躍于Scala社區(qū)。
目錄
第 一部分 小試牛刀 1
第 1章 探索Scala 3
1.1 Scala的特性 3
1.2 以少勝多 4
1.3 函數(shù)式編程 8
1.4 小結(jié) 11
第 2章 體驗(yàn)Scala 12
2.1 使用REPL 12
2.2 命令行上的Scala 14
2.3 以獨(dú)立腳本方式運(yùn)行Scala代碼 15
2.3.1 在類Unix系統(tǒng)上以獨(dú)立腳本方式運(yùn)行 15
2.3.2 在Windows上以獨(dú)立腳本方式運(yùn)行 16
2.3.3 Scala的IDE支持 16
2.4 編譯Scala 17
2.5 小結(jié) 17
第3章 從Java到Scala 18
3.1 Scala:簡(jiǎn)潔的Java 18
3.1.1 減少樣板代碼 18
3.1.2 更多便利特性 19
3.1.3 轉(zhuǎn)向函數(shù)式風(fēng)格 21
3.2 Java原始類型對(duì)應(yīng)的Scala類 21
3.3 元組和多重賦值 22
3.4 靈活的參數(shù)和參數(shù)值 24
3.4.1 傳遞變長(zhǎng)參數(shù)值 24
3.4.2 為參數(shù)提供默認(rèn)值 25
3.4.3 使用命名參數(shù) 26
3.5 隱式參數(shù) 27
3.6 字符串和多行原始字符串 29
3.7 字符串插值 30
3.8 合理的約定 32
3.9 操作符重載 33
3.10 Scala與Java的差異 35
3.10.1 賦值的結(jié)果 36
3.10.2 Scala的== 36
3.10.3 可有可無(wú)的分號(hào) 37
3.10.4 避免顯式return 38
3.11 默認(rèn)訪問修飾符 39
3.11.1 定制訪問修飾 39
3.11.2 Scala的protected 40
3.11.3 細(xì)粒度的訪問控制 41
3.12 小結(jié) 43
第4章 處理對(duì)象 44
4.1 創(chuàng)建并使用類 44
4.1.1 創(chuàng)建實(shí)例 44
4.1.2 創(chuàng)建類 45
4.1.3 定義字段、方法和構(gòu)造器 46
4.2 遵循JavaBean慣例 49
4.3 類型別名 50
4.4 擴(kuò)展一個(gè)類 51
4.5 參數(shù)化類型 52
4.6 單例對(duì)象和伴生對(duì)象 54
4.6.1 單例對(duì)象 54
4.6.2 獨(dú)立對(duì)象和伴生對(duì)象 56
4.6.3 Scala中的static 57
4.7 創(chuàng)建枚舉類 59
4.8 包對(duì)象 60
4.9 小結(jié) 63
第5章 善用類型 64
5.1 類型推斷 64
5.1.1 簡(jiǎn)單類型的類型推斷 64
5.1.2 針對(duì)泛型和集合的類型推斷 66
5.2 基礎(chǔ)類型 68
5.2.1 Any類型 68
5.2.2 關(guān)于Nothing 69
5.2.3 Option類型 70
5.2.4 Either類型 71
5.3 返回值類型推斷 73
5.4 參數(shù)化類型的型變 75
5.4.1 協(xié)變和逆變 75
5.4.2 支持協(xié)變 76
5.4.3 支持逆變 77
5.4.4 定制集合的型變 78
5.5 隱式類型轉(zhuǎn)換 78
5.5.1 隱式函數(shù) 79
5.5.2 隱式類 81
5.6 值類 83
5.7 使用隱式轉(zhuǎn)換 86
5.8 小結(jié) 88
第二部分 深入Scala 89
第6章 函數(shù)值和閉包 91
6.1 常規(guī)函數(shù)的局限性 91
6.2 可擴(kuò)展性與高階函數(shù) 92
6.3 具有多個(gè)參數(shù)的函數(shù)值 93
6.4 柯里化 96
6.5 參數(shù)的占位符 97
6.6 參數(shù)路由 98
6.7 復(fù)用函數(shù)值 99
6.8 部分應(yīng)用函數(shù) 101
6.9 閉包 102
6.10 Execute Around Method模式 103
6.11 小結(jié) 106
第7章 特質(zhì) 107
7.1 理解特質(zhì) 107
7.2 選擇性混入 110
7.3 使用特質(zhì)實(shí)現(xiàn)裝飾器模式 111
7.4 特質(zhì)中的方法延遲綁定 113
7.5 小結(jié) 115
第8章 集合 116
8.1 常見的Scala集合 116
8.2 使用Set 118
8.3 關(guān)聯(lián)映射 119
8.4 不可變列表 121
8.5 方法名約定 124
8.6 for表達(dá)式 126
8.7 小結(jié) 128
第9章 模式匹配和正則表達(dá)式 129
9.1 模式匹配綜述 129
9.1.1 匹配字面量和常量 129
9.1.2 匹配通配符 130
9.1.3 匹配元組和列表 131
9.1.4 匹配類型和守衛(wèi) 132
9.2 case表達(dá)式中的模式變量和常量 133
9.3 使用case類進(jìn)行模式匹配 135
9.4 提取器和正則表達(dá)式 138
9.4.1 使用提取器進(jìn)行模式匹配 138
9.4.2 正則表達(dá)式 141
9.4.3 正則表達(dá)式作為提取器 142
9.5 無(wú)處不在的下劃線字符 143
9.6 小結(jié) 144
第 10章 處理異常 145
10.1 Scala中的異常 145
10.2 注意catch的順序 147
10.3 小結(jié) 149
第 11章 遞歸 150
11.1 一個(gè)簡(jiǎn)單的遞歸 150
11.2 尾調(diào)用優(yōu)化(TCO) 151
11.2.1 常規(guī)遞歸并無(wú)優(yōu)化 152
11.2.2 用尾調(diào)用優(yōu)化來(lái)拯救 152
11.2.3 確保尾調(diào)用優(yōu)化 154
11.3 蹦床調(diào)用 155
11.4 小結(jié) 158
第三部分 Scala中的并發(fā)編程 159
第 12章 惰性求值和并行集合 161
12.1 釋放惰性 161
12.2 釋放嚴(yán)格集合的惰性 164
12.3 終極惰性流 167
12.4 并行集合 170
12.4.1 從順序集合入手 171
12.4.2 使用并行集合加速 173
12.5 小結(jié) 175
第 13章 使用Actor編程 176
13.1 一個(gè)順序耗時(shí)問題 176
13.2 曲折的并發(fā)之路 178
13.3 創(chuàng)建Actor 179
13.4 Actor和線程 181
13.5 隔離可變性 182
13.6 使用Actor模型進(jìn)行并發(fā) 186
13.7 使用建議 189
13.8 小結(jié) 190
第四部分 Scala實(shí)戰(zhàn) 191
第 14章 和Java進(jìn)行互操作 193
14.1 在Scala中使用Scala類 193
14.2 在Scala中使用Java類 195
14.3 在Java中使用Scala方法 197
14.4 在Java中使用特質(zhì) 198
14.5 在Java中使用單例對(duì)象和伴生對(duì)象 201
14.6 擴(kuò)展類 203
14.7 小結(jié) 204
第 15章 使用Scala創(chuàng)建應(yīng)用程序 205
15.1 獲取用戶輸入 205
15.2 讀寫文件 206
15.3 XML作為一等公民 207
15.4 讀寫XML 210
15.5 從Web獲取股票價(jià)格 213
15.6 編寫并發(fā)的資產(chǎn)凈值應(yīng)用程序 216
15.7 小結(jié) 217
第 16章 單元測(cè)試 218
16.1 使用JUnit 218
16.2 使用ScalaTest 220
16.3 使用Mockito 221
16.3.1 函數(shù)式風(fēng)格的測(cè)試 221
16.3.2 創(chuàng)建一個(gè)Mock 223
16.4 小結(jié) 227
附錄A 安裝Scala 228
參考文獻(xiàn) 230