函數式與並發編程

[美] 米歇爾·卡彭特(Michel Charpentier)著 郭濤 譯

  • 函數式與並發編程-preview-1
  • 函數式與並發編程-preview-2
  • 函數式與並發編程-preview-3
函數式與並發編程-preview-1

相關主題

商品描述

"現代語言支持的函數式和並發編程語言特性可能富有挑戰性,即使是經驗豐富的開發人員,當面對函數式與並發編程時,也可能心生畏懼。面向對象編程的程序員之所以畏懼這些特性,很可能是因為他們對這些特性的工作方式有所誤解。為了消除誤解,程序員應首先熟悉這些強大的特性背後的抽象概念。 《函數式與並發編程》介紹了一系列核心的編程語言結構,可讓你的編程工作變得高效起來,無論你使用的是哪種編程語言,你都能從中獲益——在當下的工作中,以及在未來的職業發展中。Charpentier用大量重點突出的小型Scala代碼示例闡釋了函數式與並發編程的關鍵概念,並通過完整的案例研究對前述技術和技巧進行深入的探究和闡釋。這些技術和技巧將從一種語言傳遞到另一種語言——包括Java的**版本。利用函數式和並發編程語言特性,開發人員和程序員將能編寫出易於理解、調試、優化和改進的優質代碼。 另外,本書還討論了現代編程語言中常用的類型策略,包括類型推斷、子類型、多態性、類型類、類型邊界和變型。 核心主題 ● 遞歸和尾遞歸 ● 模式匹配和代數數據類型 ● 可持久化結構和不可變性 ● 高階函數和lambda表達式 ● 延遲求值和流 ● 線程和線程池 ● 原子性和鎖 ● 同步和線程安全對象 ● 無鎖、非阻塞模式 ● Future、Promise和函數並發編程 《函數式與並發編程》中的大部分代碼示例都是使用Scala編寫的,其中包含函數式與並發編程的許多標準特性;然而,讀者不必事先瞭解Scala,而只需要熟悉一些基本概念,如類、方法、對象、類型、變量、循環和條件語句等。此外,讀者在編程方面應有足夠的經驗,以免因為簡單的語法問題而分心。 "

目錄大綱

目    錄

 

第I部分  函數式編程

第1章  函數式編程的概念 3

1.1  什麽是函數式編程 3

1.2  函數 4

1.3  從函數到函數式編程概念 5

1.4  小結 6

第2章  編程語言中的函數 7

2.1  定義函數 7

2.2  合成函數 8

2.3  定義為方法的函數 9

2.4  定義為方法的運算符 10

2.5  擴展方法 10

2.6  局部函數 11

2.7  重復參數 12

2.8  可選參數 13

2.9  命名參數 13

2.10  類型參數 14

2.11  小結 16

第3章  不可變性 17

3.1  純函數和非純函數 17

3.2  動作 18

3.3  表達式與語句 20

3.4  函數變量 22

3.5  不可變對象 23

3.6  可變狀態的實現 24

3.7  函數式列表 25

3.8  混合編程 27

3.9  更新可變/不可變對象的集合 28

3.10  小結 30

第4章  案例研究:active-passive集合 31

4.1  面向對象設計 31

4.2  函數值 33

4.3  函數對象 35

4.4  小結 36

第5章  模式匹配與代數數據類型 38

5.1  函數開關 38

5.2  元組 39

5.3  選項 40

5.4  回顧函數式列表 41

5.5  樹 43

5.6  示例:列表拉鏈 46

5.7  提取器 48

5.8  小結 49

第6章  遞歸程序設計 51

6.1  遞歸的必要性 51

6.2  遞歸算法 53

6.3  遞歸算法的關鍵原理 55

6.4  遞歸結構 56

6.5  尾遞歸 58

6.6  尾遞歸函數示例 60

6.7  小結 63

第7章  列表遞歸 64

7.1  等價的遞歸算法 64

7.2  遍歷列表 65

7.3  返回列表 66

7.4  從執行堆棧中構建列表 68

7.5  多個/嵌套列表上的遞歸 69

7.6  除尾部以外的子列表遞歸 71

7.7  逆序創建列表 73

7.8  示例:排序 74

7.9  高效地構建列表 77

7.10  小結 78

第8章  案例研究:二叉搜索樹 79

8.1  二叉搜索樹 79

8.2  二叉搜索樹的整數集 80

8.3  未重新平衡情況下的實現 81

8.4  自平衡樹 86

8.5  小結 90

第9章  高階函數 92

9.1  函數作為值 92

9.2  柯里化 95

9.3  函數字面量 96

9.4  函數與方法 99

9.5  單一抽象方法接口 100

9.6  部分應用 100

9.7  閉包 104

9.8  控制反轉 107

9.9  小結 108

第10章  標準高階函數 109

10.1  帶有謂詞參數的函數 109

10.2  映射和遍歷 111

10.3  flatMap 112

10.4  fold和reduce 116

10.5  iterate、tabulate和unfold 118

10.6  sortWith、sortBy、maxBy和minBy 119

10.7  groupBy和groupMap 120

10.8  標準高階函數的實現 121

10.9  foreach、map、flatMap和for推導式 122

10.10  小結 124

第11章  案例研究:文件樹 125

11.1  設計概述 125

11.2  節點搜索輔助函數 126

11.3  字符串表示 126

11.4  構建樹 128

11.5  查詢 131

11.6  導航 135

11.7  樹形拉鏈 135

11.8  小結 138

第12章  延遲計算 139

12.1  延遲求值的參數 139

12.2  按名稱參數 140

12.3  控制抽象 142

12.4  內部領域特定語言 144

12.5  作為延遲求值列表的流 145

12.6  管道流 147

12.7  無限數據結構流 148

12.8  迭代 149

12.9  列表、流、迭代程序和視圖 151

12.10  字段和局部變量的延遲求值 154

12.11  示例:子集和 155

12.12  小結 157

第13章  故障處理 158

13.1  例外情況和特殊值 158

13.2  使用Option 160

13.3  使用Try 160

13.4  使用Either 162

13.5  高階函數和管道 163

13.6  小結 166

第14章  案例研究:蹦床 167

14.1  尾調用優化 167

14.2  用於尾調用的蹦床函數 168

14.3  Java中的尾調用優化 169

14.4  處理非尾調用 170

14.5  小結 174

第15章  類型(及相關概念) 175

15.1  類型策略 175

15.2  類型集合 179

15.3  類型服務 180

15.4  抽象數據類型 181

15.5  類型推斷 182

15.6  子類型 185

15.7  多態性 188

15.8  類型變換 190

15.9  類型邊界 195

15.10  類型類 199

15.11  小結 203

第Ⅱ部分  並發編程

第16章  並發編程的概念 208

16.1  非順序程序 208

16.2  並發編程相關概念 211

16.3  小結 211

第17章  線程與不確定性 213

17.1  執行線程 213

17.2  使用lambda表達式創建線程 214

17.3  多線程程序的不確定性 215

17.4  線程終止 216

17.5  測試和調試多線程程序 218

17.6  小結 219

第18章  原子性和鎖 220

18.1  原子性 220

18.2  非原子操作 222

18.3  原子操作和非原子復合操作 223

18.4  鎖 226

18.5  內部鎖 227

18.6  選擇鎖目標 229

18.7  小結 231

第19章  線程安全對象 232

19.1  不可變對象 232

19.2  封裝同步策略 233

19.3  避免引用轉義 234

19.4  公用鎖和私有鎖 235

19.5  利用不可變類型 236

19.6  線程安全 239

19.7  小結 240

第20章  案例研究:線程安全隊列 242

20.1  作為列表對組的隊列 242

20.2  單個公用鎖的實現 242

20.3  單個私有鎖的實現 245

20.4  應用鎖拆分 247

20.5  小結 249

第21章  線程池 250

21.1  即發即棄異步執行 250

21.2  示例:並行服務器 252

21.3  不同類型的線程池 254

21.4  並行集合 256

21.5  小結 260

第22章  同步 261

22.1  同步的必要性 261

22.2  同步器 264

22.3  死鎖 265

22.4  使用線程轉儲調試死鎖 267

22.5  Java內存模型 268

22.6  小結 272

第23章  常用同步器 274

23.1  鎖 274

23.2  鎖存器和柵欄 276

23.3  信號量 278

23.4  條件 279

23.5  阻塞隊列 284

23.6  小結 287

第24章  案例研究:並行執行 289

24.1  順序引用實現 289

24.2  每個任務一個新線程 290

24.3  有界線程數 291

24.4  專用線程池 292

24.5  共享線程池 293

24.6  有界線程池 294

24.7  並行集合 295

24.8  使用條件提交異步任務 295

24.9  雙信號量實現 299

24.10  小結 300

第25章  Future與Promise 302

25.1  函數任務 302

25.2  Future作為同步器 303

25.3  超時、故障和取消 306

25.4  Future變體 307

25.5  Promise 308

25.6  示例:線程安全緩存 309

25.7  小結 311

第26章  函數並發編程 312

26.1  阻塞的正確性和性能問題 312

26.2  回調 314

26.3  Future的高階函數 316

26.4  Future的flatMap函數 318

26.5  示例:重新訪問並行服務器 319

26.6  函數並發編程模式 322

26.7  小結 325

第27章  最小化線程阻塞 327

27.1  原子操作 327

27.2  無鎖數據結構 330

27.3  fork/join池 332

27.4  異步編程 333

27.5  actor 334

27.6  反應流 337

27.7  非阻塞同步 338

27.8  小結 340

第28章  案例研究:並行策略 341

28.1  問題定義 341

28.2  帶超時的順序實現 342

28.3  使用invokeAny的並行實現 344

28.4  使用CompletionService的並行實現 345

28.5  Scala Future的異步實現 346

28.6  帶有CompletableFuture的異步實現 348

28.7  緩存策略的結果 350

28.8  小結 353

—附錄和詞匯表通過掃描封底二維碼獲取—

附錄  Java和Kotlin的特性 354

詞匯表 381