譯者序 ix
前言 xi
第1 章 為什么 1
1.1 范式轉變 2
1.2 跟上語言發(fā)展的潮流 4
1.3 把控制權讓渡給語言/ 運行時 4
1.4 簡潔 5
第2 章 轉變思維 9
2.1 普通的例子 9
2.1.1 命令式解法 9
2.1.2 函數(shù)式解法 10
2.2 案例研究:完美數(shù)的分類問題 15
2.2.1 完美數(shù)分類的命令式解法 15
2.2.2 稍微向函數(shù)式靠攏的完美數(shù)分類解法 16
2.2.3 完美數(shù)分類的Java 8 實現(xiàn) 18
2.2.4 完美數(shù)分類的Functional Java 實現(xiàn) 19
2.3 具有普遍意義的基本構造單元 21
2.3.1 篩選 22
2.3.2 映射 23
2.3.3 折疊/ 化約 25
2.4 函數(shù)的同義異名問題 28
2.4.1 篩選 28
2.4.2 映射 31
2.4.3 折疊/ 化約 33
第3 章 權責讓渡 37
3.1 迭代讓位于高階函數(shù) 37
3.2 閉包 38
3.3 柯里化和函數(shù)的部分施用 41
3.3.1 定義與辨析 41
3.3.2 Groovy 的情況 42
3.3.3 Clojure 的情況 44
3.3.4 Scala 的情況 44
3.3.5 一般用途 47
3.4 遞歸 48
3.5 Stream 和作業(yè)順序重排 53
第4 章 用巧不用蠻 55
4.1 記憶 55
4.1.1 緩存 56
4.1.2 引入“記憶” 59
4.2 緩求值 65
4.2.1 Java 語言下的緩求值迭代子 65
4.2.2 使用Totally Lazy 框架的完美數(shù)分類實現(xiàn) 67
4.2.3 Groovy 語言的緩求值列表 69
4.2.4 構造緩求值列表 72
4.2.5 緩求值的好處 74
4.2.6 緩求值的字段初始化 76
第5 章 演化的語言 79
5.1 少量的數(shù)據(jù)結構搭配大量的操作 79
5.2 讓語言去迎合問題 81
5.3 對分發(fā)機制的再思考 82
5.3.1 Groovy 對分發(fā)機制的改進82
5.3.2 “身段柔軟”的Clojure 語言 83
5.3.3 Clojure 的多重方法和基于任意特征的多態(tài) 85
5.4 運算符重載 87
5.4.1 Groovy 87
5.4.2 Scala 89
5.5 函數(shù)式的數(shù)據(jù)結構 91
5.5.1 函數(shù)式的錯誤處理 91
5.5.2 Either 類 92
5.5.3 Option 類 100
5.5.4 Either 樹和模式匹配 100
第6 章 模式與重用 107
6.1 函數(shù)式語言中的設計模式 107
6.2 函數(shù)級別的重用 108
6.2.1 Template Method 模式 109
6.2.2 Strategy 模式 111
6.2.3 Flyweight 模式和記憶 113
6.2.4 Factory 模式和柯里化 116
6.3 結構化重用和函數(shù)式重用的對比 117
第7 章 現(xiàn)實應用 125
7.1 Java 8 125
7.1.1 函數(shù)式接口 126
7.1.2 Optional 類型 128
7.1.3 Java 8 的stream 128
7.2 函數(shù)式的基礎設施 129
7.2.1 架構 129
7.2.2 Web 框架 132
7.2.3 數(shù)據(jù)庫 133
第8 章 多語言與多范式 135
8.1 函數(shù)式與元編程的結合 136
8.2 利用元編程在數(shù)據(jù)類型之間建立映射 137
8.3 多范式語言的后顧之憂 140
8.4 上下文型抽象與復合型抽象的對比 141
8.5 函數(shù)式金字塔 143
作者簡介 147
封面介紹 147