內容簡介
《Java函數式編程》並不是一本關於Java的書,而是一本關於函數式編程的書。作者由淺入深地介紹瞭函數式編程的思維方式,並引導讀者通過易於掌握的例子、練習和圖錶來學習和鞏固函數式編程的基本原則和*佳實踐。讀者甚至可以在閱讀的同時編寫齣自己的函數式類庫!本書非常適閤對Java有所瞭解的程序員,無須任何基礎的數學理論或是函數式編程經驗即可快速上手!
作者簡介
Pierre-Yves Saumont是一名擁有三十年設計和構建企業級軟件的Java開發者。他目前是Alcatel-Lucent Submarine Networks公司的一名軟件研發工程師。
高清華***軟件研發工程師。工作十多年來,在簡潔代碼、自動化測試、持續交付、DevOps 等方麵都有著豐富的經驗。《DevOps 實踐》譯者之一。技術博客:http://qinghua.github.io/,希望能以通俗易懂的語言普及IT 技術。
目錄
目錄
第1章 什麼是函數式編程............................. 1
1.1 函數式編程是什麼 .............................................2
1.2 編寫沒有副作用的程序 .....................................4
1.3 引用透明如何讓程序更安全 .............................6
1.4 函數式編程的優勢 .............................................7
1.5 用代換模型來推斷程序 .....................................8
1.6 將函數式原則應用於一個簡單的例子 .............9
1.7 抽象到極緻 .15
1.8 總結 .............16
第2章 在Java中使用函數 ............................17
2.1 什麼是函數 .18
2.1.1 現實世界裏的函數 ...............................18
2.2 Java中的函數 ....................................................24
2.2.1 函數式的方法 .......................................24
2.2.2 Java的函數式接口與匿名類 ...............30
2.2.3 復閤函數 ...............................................31
2.2.4 多態函數 ...............................................32
2.2.5 通過 lambda簡化代碼 ..........................33
2.3 高級函數特性 ...................................................36
2.3.1 多參函數怎麼樣 ...................................36
2.3.2 應用柯裏化函數 ...................................37
2.3.3 高階函數 ...............................................38
2.3.4 多態高階函數 .......................................39
2.3.5 使用匿名函數 .......................................43
2.3.6 局部函數 ...............................................45
2.3.7 閉包 .46
2.3.8 部分函數應用和自動柯裏化 ...............48
2.3.9 交換部分應用函數的參數 ...................53
2.3.10 遞歸函數 .............................................54
2.3.11 恒等函數 ..............................................56
2.4 Java 8的函數式接口 .........................................58
2.5 調試lambda ..59
2.6 總結 .............62
第3章 讓Java更加函數式 ............................63
3.1 使標準控製結構具有函數式風格 ...................64
3.2 抽象控製結構 ...................................................65
3.2.1 清理代碼 ...............................................69
3.2.2 if … else的另一種方式 ........................73
3.3 抽象迭代 .....78
3.3.1 使用映射抽象列錶操作 .......................79
3.3.2 創建列錶 ...............................................80
3.3.3 使用 head和 tail操作...........................81
3.3.4 函數式地添加列錶元素 .......................83
3.3.5 化簡和摺疊列錶 ...................................83
3.3.6 復閤映射和映射復閤 ...........................90
3.3.7 對列錶應用作用 ...................................91
3.3.8 處理函數式的輸齣 ...............................92
3.3.9 構建反遞歸列錶 ...................................93
3.4 使用正確的類型 ...............................................97
3.4.1 標準類型的問題 ...................................97
3.4.2 定義值類型 ...........................................99
3.4.3 值類型的未來 .....................................103
3.5 總結 ...........103
第4章 遞歸、反遞歸和記憶化 ................... 104
4.1 理解反遞歸和遞歸 .........................................105
4.1.1 探討反遞歸和遞歸的加法例子 .........105
4.1.2 在 Java中實現遞歸 ............................106
4.1.3 使用尾調用消除 .................................107
4.1.4 使用尾遞歸方法和函數 .....................107
4.1.5 抽象遞歸 .............................................108
4.1.6 為基於棧的遞歸方法使用一個直接替代品 ...........................................112
4.2 使用遞歸函數 .................................................115
4.2.1 使用局部定義的函數 .........................115
4.2.2 使函數成為尾遞歸 .............................116
4.2.3 雙遞歸函數:斐波那契數列示例 .....117
4.2.4 讓列錶的方法變成棧安全的遞歸 .....120
4.3 復閤大量函數 .................................................123
4.4 使用記憶化 .....................................................127
4.4.1 命令式編程中的記憶化 .....................127
4.4.2 遞歸函數的記憶化 .............................128
4.4.3 自動記憶化 .........................................130
4.5 總結 ...........136
第5章 用列錶處理數據 ............................. 138
5.1 如何對數據集閤進行分類 .............................138
5.1.1 不同的列錶類型 .................................139
5.1.2 對列錶性能的相對期望 .....................140
5.1.3 時間與空間,時間與復雜度的取捨 .141
5.1.4 直接修改 .............................................142
5.1.5 持久化數據結構 .................................143
5.2 一個不可變、持久化的單鏈錶實現 .............144
5.3 在列錶操作中共享數據 .................................148
5.3.1 更多列錶操作 .....................................150
5.4 使用高階函數遞歸摺疊列錶 .........................155
5.4.1 基於堆的 foldRight遞歸版 ................162
5.4.2 映射和過濾列錶 .................................164
5.5 總結 ...........167
第6章 處理可選數據 ................................ 168
6.1 空指針的問題 .................................................169
6.2 空引用的替代方案 .........................................171
6.3 Option數據類型 ..............................................174
6.3.1 從 Option中取值 ................................176
6.3.2 將函數應用於可選值 .........................178
6.3.3 復閤 Option處理 ................................179
6.3.4 Option的用例 .....................................181
6.3.5 復閤 Option的其他方法 ....................186
6.3.6 復閤 Option和 List .............................189
6.4 Option的其他實用程序 ..................................191
6.4.1 檢查是 Some還是 None .....................191
6.4.2 equals和 hashcode ..............................192
6.5 如何及何時使用Option ..................................193
6.6 總結 ...........195
第7章 處理錯誤和異常 ............................. 197
7.1 待解決的問題 .................................................197
7.2 Either類型 ..199
7.2.1 復閤 Either ...........................................200
7.3 Result類型 .203
7.3.1 為 Result類添加方法 .........................204
7.4 Result模式 .206
7.5 Result處理進階 ...............................................213
7.5.1 應用斷言 .............................................214
7.5.2 映射 Failure .........................................215
7.5.3 增加工廠方法 .....................................218
7.5.4 應用作用 .............................................220
7.5.5 Result復閤進階 ..................................222
7.6 總結 ...........226
第8章 列錶處理進階 ................................ 228
8.1 length的問題 ...................................................229
8.1.1 性能問題 .............................................229
8.1.2 記憶化的優點 .....................................230
8.1.3 記憶化的缺點 .....................................230
8.1.4 實際性能 .............................................232
8.2 復閤List和Result .............................................233
8.2.1 List中返迴 Result的方法 ..................233
8.2.2 將 List<Result>轉換為 Result<List> 235
8.3 抽象常見列錶用例 .........................................238
8.3.1 壓縮和解壓縮列錶 .............................238
8.3.2 通過索引訪問元素 .............................241
8.3.3 拆分列錶 .............................................244
8.3.4 搜索子列錶 .........................................248
8.3.5 使用列錶的其他函數 .........................249
8.4 自動並行處理列錶 .........................................254
8.4.1 並非所有的計算都可以並行化 .........254
8.4.2 將列錶拆分為子列錶 .........................254
8.4.3 並行處理子列錶 .................................256
8.5 總結 ...........258
第9章 使用惰性....................................... 259
9.1 理解嚴格和惰性 .............................................259
9.1.1 Java是一門嚴格的語言 .....................260
9.1.2 嚴格帶來的問題 .................................261
9.2 實現惰性 ...263
9.3 隻有惰性纔能做到的事 .................................264
9.4 為何不要
Java函數式編程 下載 mobi epub pdf txt 電子書