産品特色
編輯推薦
Java 8的發布使Java程序設計發生瞭翻天覆地的變化。利用Java 8中新引入的函數式特性,你可以在更短的時間內用更簡潔的代碼完成更復雜的功能,同時還能充分利用硬件的多核架構。
本書結構清晰、內容翔實,從實例入手,涵蓋Java 8的主要新特性,包括Lambda錶達式、方法引用、流、默認方法、Optional、CompletableFuture以及新的日期和時間API,是程序員瞭解Java 8新特性的**指南。
本書的主要內容如下:
如何使用Java 8新增的強大特性
如何編寫能有效利用多核架構的程序
重構、測試和調試
怎樣高效地應用函數式編程
內容簡介
本書全麵介紹瞭Java 8 這個裏程碑版本的新特性,包括Lambdas、流和函數式編程。有瞭函數式的編程特性,可以讓代碼更簡潔,同時也能自動化地利用多核硬件。全書分四個部分:基礎知識、函數式數據處理、高效Java 8 編程和**Java 8,清晰明瞭地嚮讀者展現瞭一幅Java 與時俱進的現代化畫捲。
作者簡介
Raoul-Gabriel Urma
劍橋大學計算機科學博士,軟件工程師,演講者,培訓師,Cambridge Coding Academy聯閤創始人、CEO。曾與榖歌、eBay、甲骨文和高盛集團等大公司閤作,並參與過多個創業項目。撰寫過十餘篇經同行審閱的技術文章,並在國際會議上發錶過40多篇演講。
Mario Fusco
Red Hat高級軟件工程師,負責JBoss規則引擎Drools的核心開發。擁有豐富的Java開發經驗,曾領導媒體公司、金融部門等多個行業的企業級項目開發。對函數式編程和領域特定語言等有濃厚興趣,並創建瞭開放源碼庫lambdaj。
Alan Mycroft
劍橋大學計算機實驗室計算學教授,劍橋大學羅賓遜學院研究員,歐洲編程語言和係統協會聯閤創始人,樹莓派基金會聯閤創始人和理事。發錶過大約100篇研究論文,指導過20多篇博士論文。他的研究主要關注編程語言及其語義、優化和實施。他與業界聯係緊密,曾於學術休假期間在AT T實驗室和英特爾工作,還創立瞭Codemist公司,該公司設計瞭ARM C編譯器Norcroft。
目錄
目錄
第一部分 基礎知識
第1 章 為什麼要關心Java 8 2
1.1 Java 怎麼還在變 4
1.1.1 Java 在編程語言生態係統中的位置 4
1.1.2 流處理 6
1.1.3 用行為參數化把代碼傳遞給方法 7
1.1.4 並行與共享的可變數據 7
1.1.5 Java 需要演變 8
1.2 Java 中的函數 8
1.2.1 方法和Lambda 作為一等公民 9
1.2.2 傳遞代碼:一個例子 11
1.2.3 從傳遞方法到Lambda 12
1.3 流 13
1.4 默認方法 17
1.5 來自函數式編程的其他好思想 18
1.6 小結 19
第2 章 通過行為參數化傳遞代碼 20
2.1 應對不斷變化的需求 21
2.1.1 初試牛刀:篩選綠蘋果 21
2.1.2 再展身手:把顔色作為參數 21
2.1.3 第三次嘗試:對你能想到的每個屬性做篩選 22
2.2 行為參數化 23
2.3 對付囉嗦 27
2.3.1 匿名類 28
2.3.2 第五次嘗試:使用匿名類 28
2.3.3 第六次嘗試:使用Lambda錶達式 30
2.3.4 第七次嘗試:將List 類型抽象化 31
2.4 真實的例子 31
2.4.1 用Comparator 來排序 31
2.4.2 用Runnable 執行代碼塊 32
2.4.3 GUI 事件處理 32
2.5 小結 33
第3 章 Lambda 錶達式 34
3.1 Lambda 管中窺豹 35
3.2 在哪裏以及如何使用Lambda 37
3.2.1 函數式接口 37
3.2.2 函數描述符 39
3.3 把Lambda 付諸實踐:環繞執行模式 41
3.3.1 第1 步:記得行為參數化 41
3.3.2 第2 步:使用函數式接口來傳遞行為 42
3.3.3 第3 步:執行一個行為 42
3.3.4 第4 步:傳遞Lambda 42
3.4 使用函數式接口 43
3.4.1 Predicate 44
3.4.2 Consumer 44
3.4.3 Function 45
3.5 類型檢查、類型推斷以及限製 49
3.5.1 類型檢查 49
3.5.2 同樣的Lambda,不同的函數式接口 50
3.5.3 類型推斷 51
3.5.4 使用局部變量 52
3.6 方法引用 53
3.6.1 管中窺豹 53
3.6.2 構造函數引用 55
3.7 Lambda 和方法引用實戰 57
3.7.1 第1 步:傳遞代碼 58
3.7.2 第2 步:使用匿名類 58
3.7.3 第3 步:使用Lambda 錶達式 58
3.7.4 第4 步:使用方法引用 59
3.8 復閤Lambda 錶達式的有用方法 59
3.8.1 比較器復閤 60
3.8.2 謂詞復閤 60
3.8.3 函數復閤 61
3.9 數學中的類似思想 62
3.9.1 積分 62
3.9.2 與Java 8 的Lambda 聯係起來 63
3.10 小結 64
第二部分 函數式數據處理
第4 章 引入流 68
4.1 流是什麼 68
4.2 流簡介 72
4.3 流與集閤 74
4.3.1 隻能遍曆一次 75
4.3.2 外部迭代與內部迭代 76
4.4 流操作 78
4.4.1 中間操作 78
4.4.2 終端操作 79
4.4.3 使用流 80
4.5 小結 81
第5 章 使用流 82
5.1 篩選和切片 83
5.1.1 用謂詞篩選 83
5.1.2 篩選各異的元素 83
5.1.3 截短流 84
5.1.4 跳過元素 85
5.2 映射 86
5.2.1 對流中每一個元素應用函數 86
5.2.2 流的扁平化 87
5.3 查找和匹配 90
5.3.1 檢查謂詞是否至少匹配一個元素 90
5.3.2 檢查謂詞是否匹配所有元素 90
5.3.3 查找元素 91
5.3.4 查找第一個元素 92
5.4 歸約 92
5.4.1 元素求和 93
5.4.2 最大值和最小值 94
5.5 付諸實踐 97
5.5.1 領域:交易員和交易 98
5.5.2 解答 99
5.6 數值流 101
5.6.1 原始類型流特化 101
5.6.2 數值範圍 102
5.6.3 數值流應用:勾股數 103
5.7 構建流 105
5.7.1 由值創建流 106
5.7.2 由數組創建流 106
5.7.3 由文件生成流 106
5.7.4 由函數生成流:創建無限流 107
5.8 小結 110
第6 章 用流收集數據 111
6.1 收集器簡介 112
6.1.1 收集器用作高級歸約 112
6.1.2 預定義收集器 113
6.2 歸約和匯總 114
6.2.1 查找流中的最大值和最小值 114
6.2.2 匯總 115
6.2.3 連接字符串 116
6.2.4 廣義的歸約匯總 117
6.3 分組 120
6.3.1 多級分組 121
6.3.2 按子組收集數據 122
6.4 分區 126
6.4.1 分區的優勢 126
6.4.2 將數字按質數和非質數分區 128
6.5 收集器接口 129
6.5.1 理解Collector 接口聲明的方法 130
6.5.2 全部融閤到一起 134
6.6 開發你自己的收集器以獲得更好的性能 135
6.6.1 僅用質數做除數 136
6.6.2 比較收集器的性能 139
6.7 小結 140
第7 章 並行數據處理與性能 141
7.1 並行流 141
7.1.1 將順序流轉換為並行流 142
7.1.2 測量流性能 144
7.1.3 正確使用並行流 147
7.1.4 高效使用並行流 148
7.2 分支/閤並框架 149
7.2.1 使用RecursiveTask 149
7.2.2 使用分支/閤並框架的最佳做法 153
7.2.3 工作竊取 154
7.3 Spliterator 155
7.3.1 拆分過程 155
7.3.2 實現你自己的Spliterator 157
7.4 小結 162
第三部分 高效Java 8編程
第8 章 重構、測試和調試 164
8.1 為改善可讀性和靈活性重構代碼 164
8.1.1 改善代碼的可讀性 165
8.1.2 從匿名類到Lambda 錶達式的轉換 165
8.1.3 從Lambda 錶達式到方法引用的轉換 166
8.1.4 從命令式的數據處理切換到Stream 167
8.1.5 增加代碼的靈活性 168
8.2 使用Lambda 重構麵嚮對象的設計模式 170
8.2.1 策略模式 171
8.2.2 模闆方法 172
8.2.3 觀察者模式 173
8.2.4 責任鏈模式 175
8.2.5 工廠模式 177
8.3 測試Lambda 錶達式 178
8.3.1 測試可見Lambda 函數的行為 179
8.3.2 測試使用Lambda 的方法的行為 179
8.3.3 將復雜的Lambda 錶達式分到不同的方法 180
8.3.4 高階函數的測試 180
8.4 調試 181
8.4.1 查看棧跟蹤 181
8.4.2 使用日誌調試 183
8.5 小結 184
第9 章 默認方法 185
9.1 不斷演進的API 187
9.1.1 初始版本的API 188
9.1.2 第二版API 188
9.2 概述默認方法 190
9.3 默認方法的使用模式 192
9.3.1 可選方法 192
9.3.2 行為的多繼承 192
9.4 解決衝突的規則 196
9.4.1 解決問題的三條規則 196
9.4.2 選擇提供瞭最具體實現的默認方法的接口 197
9.4.3 衝突及如何顯式地消除歧義 198
9.4.4 菱形繼承問題 200
9.5 小結 201
第10 章 用Optional 取代null 202
10.1 如何為缺失的值建模 203
10.1.1 采用防禦式檢查減少Null-PointerException 203
10.1.2 null 帶來的種種問題 204
10.1.3 其他語言中null 的替代品 205
10.2 Optional 類入門 206
10.3 應用Optional 的幾種模式 207
10.3.1 創建Optional 對象 208
10.3.2 使用map 從Optional對象中提取和轉換值 208
10.3.3 使用flatMap 鏈接Optional 對象 209
10.3.4 默認行為及解引用Optional 對象 213
10.3.5 兩個Optional 對象的組閤 213
10.3.6 使用filter 剔除特定的值 214
10.4 使用Optional 的實戰示例 216
10.4.1 用Optional 封裝可能為null 的值 216
10.4.2 異常與Optional 的對比 217
10.4.3 把所有內容整閤起來 218
10.5 小結 219
第11 章 CompletableFuture:組閤式異步編程 220
11.1 Future 接口 222
11.1.1 Future 接口的局限性 223
11.1.2 使用CompletableFuture構建異步應用 223
11.2 實現異步API 224
11.2.1 將同步方法轉換為異步方法 225
11.2.2 錯誤處理 227
11.3 讓你的代碼免受阻塞之苦 228
11.3.1 使用並行流對請求進行並行操作 229
11.3.2 使用CompletableFuture發起異步請求 230
11.3.3 尋找更好的方案 232
11.3.4 使用定製的執行器 233
11.4 對多個異步任務進行流水綫操作 234
11.4.1 實現摺扣服務 235
11.4.2 使用Discount 服務 236
11.4.3 構造同步和異步操作 237
11.4.4 將兩個Completable-Future 對象整閤起來,無論它們是否存在依賴 239
11.4.5 對Future 和Completable-Future 的迴顧 241
11.5 響應CompletableFuture 的completion 事件 242
11.5.1 對最佳價格查詢器應用的優化 243
11.5.2 付諸實踐 244
11.6 小結 245
第12 章 新的日期和時間API 246
12.1 LocalDate、LocalTime、Instant、Duration 以及Period 247
12.1.1 使用LocalDate 和LocalTime 247
12.1.2 閤並日期和時間 248
12.1.3 機器的日期和時間格式 249
12.1.4 定義Duration 或Period 249
12.2 操縱、解析和格式化日期 251
12.2.1 使用TemporalAdjuster 253
12.2.2 打印輸齣及解析日期時間對象 255
12.3 處理不同的時區和曆法 256
12.3.1 利用和UTC/格林尼治時間的固定偏差計算時區 257
12.3.2 使用彆的日曆係統 258
12.4 小結 259
第四部分 超越Java 8
第13 章 函數式的思考 262
13.1 實現和維護係統 262
13.1.1 共享的可變數據 263
13.1.2 聲明式編程 264
13.1.3 為什麼要采用函數式編程 265
13.2 什麼是函數式編程 265
13.2.1 函數式Java 編程 266
13.2.2 引用透明性 268
13.2.3 麵嚮對象的編程和函數式編程的對比 268
13.2.4 函數式編程實戰 269
13.3 遞歸和迭代 271
13.4 小結 274
第14 章 函數式編程的技巧 275
14.1 無處不在的函數 275
14.1.1 高階函數 275
14.1.2 科裏化 277
14.2 持久化數據結構 278
14.2.1 破壞式更新和函數式更新的比較 279
14.2.2 另一個使用Tree 的例子 281
14.2.3 采用函數式的方法 282
14.3 Stream 的延遲計算 283
14.3.1 自定義的Stream 283
14.3.2 創建你自己的延遲列錶 286
14.4 模式匹配 290
14.4.1 訪問者設計模式 291
14.4.2 用模式匹配力挽狂瀾 292
14.5 雜項 295
14.5.1 緩存或記憶錶 295
14.5.2 “返迴同樣的對象”意味著什麼 296
14.5.3 結閤器 296
14.6 小結 297
第15 章 麵嚮對象和函數式編程的混閤:Java 8 和Scala 的比較 299
15.1 Scala 簡介 300
15.1.1 你好,啤酒 300
15.1.2 基礎數據結構:List、Set、Map、Tuple、Stream以及Option 302
15.2 函數 306
15.2.1 Scala 中的一等函數 307
15.2.2 匿名函數和閉包 307
15.2.3 科裏化 309
15.3 類和trait 310
15.3.1 更加簡潔的Scala 類 310
15.3.2 Scala 的trait 與Java 8 的接口對比 311
15.4 小結 312
第16 章 結論以及Java 的未來 313
16.1 迴顧Java 8 的語言特性 313
16.1.1 行為參數化(Lambda 以及方法引用) 314
16.1.2 流 314
16.1.3 CompletableFuture 315
16.1.4 Optional 315
16.1.5 默認方法 316
16.2 Java 的未來 316
16.2.1 集閤 316
16.2.2 類型係統的改進 317
16.2.3 模式匹配 318
16.2.4 更加豐富的泛型形式 319
16.2.5 對不變性的更深層支持 321
16.2.6 值類型 322
16.3 寫在最後的話 325
附錄A 其他語言特性的更新 326
附錄B 類庫的更新 330
附錄C 如何以並發方式在同一個流上
執行多種操作 338
附錄D Lambda 錶達式和JVM 字
節碼 346
前言/序言
Java 8實戰 下載 mobi epub pdf txt 電子書