本書介紹了Java 8 這個里程碑版本的新特性,包括Lambdas、流和函數式編程。有了函數式的編程特性,可以讓代碼更簡潔,同時也能自動化地利用多核硬件。全書分四個部分:基礎知識、函數式數據處理、高效Java 8 編程和超越Java 8,清晰明了地向讀者展現了一幅Java 與時俱進的現代化畫卷。
Java 8的使Java程序設計發生了翻天覆地的變化。利用Java 8中新引入的函數式特性,你可以在更短的時間內用更簡潔的代碼完成更復雜的功能,同時還能充分利用硬件的多核架構。
本書結構清晰、內容翔實,從實例入手,涵蓋Java 8的主要新特性,包括Lambda表達式、方法引用、流、默認方法、Optional、CompletableFuture以及新的日期和時間API,是程序員了解Java 8新特性的指南。
本書的主要內容如下:
如何使用Java 8新增的強大特性
如何編寫能有效利用多核架構的程序
重構、測試和調試
怎樣高效地應用函數式編程
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 82
1.1Java怎么還在變4
1.1.1Java在編程語言生態系統中的位置4
1.1.2流處理6
1.1.3用行為參數化把代碼傳遞給方法7
1.1.4并行與共享的可變數據7
1.1.5Java需要演變8
1.2Java中的函數8
1.2.1方法和Lambda作為一等公民9
1.2.2傳遞代碼:一個例子11
1.2.3從傳遞方法到Lambda12
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.3GUI事件處理32
2.5小結33
第3章Lambda表達式34
3.1Lambda管中窺豹35
3.2在哪里以及如何使用Lambda37
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步:傳遞Lambda42
3.4使用函數式接口43
3.4.1Predicate44
3.4.2Consumer44
3.4.3Function45
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.7Lambda和方法引用實戰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使用RecursiveTask149
7.2.2使用分支/合并框架的做法153
7.2.3工作竊取154
7.3Spliterator155
7.3.1拆分過程155
7.3.2實現你自己的Spliterator157
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從命令式的數據處理切換到Stream167
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初始版本的API188
9.1.2第二版API188
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取代null202
10.1如何為缺失的值建模 203
10.1.1采用防御式檢查減少Null-PointerException203
10.1.2null帶來的種種問題204
10.1.3其他語言中null的替代品205
10.2Optional類入門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.1Future接口222
11.1.1Future接口的局限性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章新的日期和時間API246
12.1LocalDate、LocalTime、Instant、Duration以及Period247
12.1.1使用LocalDate和LocalTime247
12.1.2合并日期和時間248
12.1.3機器的日期和時間格式249
12.1.4定義Duration或Period249
12.2操縱、解析和格式化日期251
12.2.1使用TemporalAdjuster253
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.3Stream的延遲計算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.1Scala簡介300
15.1.1你好,啤酒300
15.1.2基礎數據結構:List、Set、Map、Tuple、Stream以及Option302
15.2函數306
15.2.1Scala中的一等函數307
15.2.2匿名函數和閉包307
15.2.3科里化309
15.3類和trait310
15.3.1更加簡潔的Scala類310
15.3.2Scala的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.3CompletableFuture315
16.1.4Optional315
16.1.5默認方法316
16.2Java 的未來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
附錄DLambda表達式和JVM 字節碼346
“這是一部十分杰出且簡明的著作,書中提供了大量的示例,能幫助你迅速地掌握Java 8中的新特性。”——Jason Lee,甲骨文公司“這是超棒的Java 8指南!”——William Wheeler,ProData Computer Systems公司
“這本書中有關新的Stream API及Lambda表達式的示例非常有用。”——Steve Rogers, CGTek公司
“這是所有使用Java 8函數式特性的程序員都必讀的工具書。”——Mayur S. Patil,麻省理工學院
還可以吧。
學習下,面試用
這本書的內容真的很棒,很實用,印刷還可以,整體感覺很不錯,當當的物流也比較給力,前一天晚上下單的,第二天就到了
工作上用的到
java8學起來,內容不錯,繼續學習新技術
整體感覺不錯
很LOL木木木木木木嘟嘟嘟諾記
性價比很高
很好,很值得學習
很好,很不錯,值得購買
不錯,值得一看
紙張很好!
不錯,正版
實惠,買的最劃算的一次
大卡推薦的書,還沒來得及看,先好評!
非常滿意 推薦大家購買
不錯的不錯的
函數式編程
值得擁有,只是翻譯不是太好。
不錯啊不錯不錯不錯啊不錯不錯不錯啊不錯不錯
書很不錯!!
很好,包裝好,內容也好,學習java8的好選擇
真心不錯,一如既往的manning出版社風格,很喜歡
內容不錯,java不斷升級,自身也需要跟上時代的腳步。
內容不錯,涵蓋了java8的新特性。尤其對于其lambda表達式有了直觀的闡述。強烈推薦!
這本書寫的很不錯,對于希望掌握java8新特性的開發人員來說值得一看
學習之利器,java8很多特性呢,嗯,是我們,程序員學習java8的,一個很好的,很好的一本入門書。
詳細介紹了 Java8 的一些新特性,很值得看的一本中高級 Java 書