本書介紹了Java 8 這個(gè)里程碑版本的新特性,包括Lambdas、流和函數(shù)式編程。有了函數(shù)式的編程特性,可以讓代碼更簡(jiǎn)潔,同時(shí)也能自動(dòng)化地利用多核硬件。全書分四個(gè)部分:基礎(chǔ)知識(shí)、函數(shù)式數(shù)據(jù)處理、高效Java 8 編程和超越Java 8,清晰明了地向讀者展現(xiàn)了一幅Java 與時(shí)俱進(jìn)的現(xiàn)代化畫卷。
Java 8的使Java程序設(shè)計(jì)發(fā)生了翻天覆地的變化。利用Java 8中新引入的函數(shù)式特性,你可以在更短的時(shí)間內(nèi)用更簡(jiǎn)潔的代碼完成更復(fù)雜的功能,同時(shí)還能充分利用硬件的多核架構(gòu)。
本書結(jié)構(gòu)清晰、內(nèi)容翔實(shí),從實(shí)例入手,涵蓋Java 8的主要新特性,包括Lambda表達(dá)式、方法引用、流、默認(rèn)方法、Optional、CompletableFuture以及新的日期和時(shí)間API,是程序員了解Java 8新特性的指南。
本書的主要內(nèi)容如下:
如何使用Java 8新增的強(qiáng)大特性
如何編寫能有效利用多核架構(gòu)的程序
重構(gòu)、測(cè)試和調(diào)試
怎樣高效地應(yīng)用函數(shù)式編程
Raoul-Gabriel Urma
劍橋大學(xué)計(jì)算機(jī)科學(xué)博士,軟件工程師,演講者,培訓(xùn)師,Cambridge Coding Academy聯(lián)合創(chuàng)始人、CEO。曾與谷歌、eBay、甲骨文和高盛集團(tuán)等大公司合作,并參與過(guò)多個(gè)創(chuàng)業(yè)項(xiàng)目。撰寫過(guò)十余篇經(jīng)同行審閱的技術(shù)文章,并在國(guó)際會(huì)議上發(fā)表過(guò)40多篇演講。
Mario Fusco
Red Hat高級(jí)軟件工程師,負(fù)責(zé)JBoss規(guī)則引擎Drools的核心開發(fā)。擁有豐富的Java開發(fā)經(jīng)驗(yàn),曾領(lǐng)導(dǎo)媒體公司、金融部門等多個(gè)行業(yè)的企業(yè)級(jí)項(xiàng)目開發(fā)。對(duì)函數(shù)式編程和領(lǐng)域特定語(yǔ)言等有濃厚興趣,并創(chuàng)建了開放源碼庫(kù)lambdaj。
Alan Mycroft
劍橋大學(xué)計(jì)算機(jī)實(shí)驗(yàn)室計(jì)算學(xué)教授,劍橋大學(xué)羅賓遜學(xué)院研究員,歐洲編程語(yǔ)言和系統(tǒng)協(xié)會(huì)聯(lián)合創(chuàng)始人,樹莓派基金會(huì)聯(lián)合創(chuàng)始人和理事。發(fā)表過(guò)大約100篇研究論文,指導(dǎo)過(guò)20多篇博士論文。他的研究主要關(guān)注編程語(yǔ)言及其語(yǔ)義、優(yōu)化和實(shí)施。他與業(yè)界聯(lián)系緊密,曾于學(xué)術(shù)休假期間在AT T實(shí)驗(yàn)室和英特爾工作,還創(chuàng)立了Codemist公司,該公司設(shè)計(jì)了ARM C編譯器Norcroft。
及時(shí)部分 基礎(chǔ)知識(shí)
第1章為什么要關(guān)心Java 82
1.1Java怎么還在變4
1.1.1Java在編程語(yǔ)言生態(tài)系統(tǒng)中的位置4
1.1.2流處理6
1.1.3用行為參數(shù)化把代碼傳遞給方法7
1.1.4并行與共享的可變數(shù)據(jù)7
1.1.5Java需要演變8
1.2Java中的函數(shù)8
1.2.1方法和Lambda作為一等公民9
1.2.2傳遞代碼:一個(gè)例子11
1.2.3從傳遞方法到Lambda12
1.3流13
1.4默認(rèn)方法17
1.5來(lái)自函數(shù)式編程的其他好思想18
1.6小結(jié)19
第2章通過(guò)行為參數(shù)化傳遞代碼20
2.1應(yīng)對(duì)不斷變化的需求21
2.1.1初試牛刀:篩選綠蘋果21
2.1.2再展身手:把顏色作為參數(shù)21
2.1.3第三次嘗試:對(duì)你能想到的每個(gè)屬性做篩選22
2.2行為參數(shù)化23
2.3對(duì)付啰嗦27
2.3.1匿名類28
2.3.2第五次嘗試:使用匿名類28
2.3.3第六次嘗試:使用Lambda表達(dá)式30
2.3.4第七次嘗試:將List類型抽象化31
2.4真實(shí)的例子31
2.4.1用Comparator來(lái)排序31
2.4.2用Runnable執(zhí)行代碼塊32
2.4.3GUI事件處理32
2.5小結(jié)33
第3章Lambda表達(dá)式34
3.1Lambda管中窺豹35
3.2在哪里以及如何使用Lambda37
3.2.1函數(shù)式接口37
3.2.2函數(shù)描述符39
3.3把Lambda付諸實(shí)踐:環(huán)繞執(zhí)行模式41
3.3.1第1步記得行為參數(shù)化41
3.3.2第2步:使用函數(shù)式接口來(lái)傳遞行為42
3.3.3第3步:執(zhí)行一個(gè)行為42
3.3.4第4步:傳遞Lambda42
3.4使用函數(shù)式接口43
3.4.1Predicate44
3.4.2Consumer44
3.4.3Function45
3.5類型檢查、類型推斷以及限制49
3.5.1類型檢查49
3.5.2同樣的Lambda,不同的函數(shù)式接口50
3.5.3類型推斷51
3.5.4使用局部變量52
3.6方法引用53
3.6.1管中窺豹53
3.6.2構(gòu)造函數(shù)引用55
3.7Lambda和方法引用實(shí)戰(zhàn)57
3.7.1第1步:傳遞代碼58
3.7.2第2步:使用匿名類58
3.7.3第3步:使用Lambda表達(dá)式58
3.7.4第4步:使用方法引用59
3.8復(fù)合Lambda表達(dá)式的有用方法59
3.8.1比較器復(fù)合60
3.8.2謂詞復(fù)合60
3.8.3函數(shù)復(fù)合61
3.9數(shù)學(xué)中的類似思想62
3.9.1積分62
3.9.2與Java 8的Lambda聯(lián)系起來(lái)63
3.10小結(jié)64
第二部分 函數(shù)式數(shù)據(jù)處理
第4章引入流68
4.1流是什么68
4.2流簡(jiǎn)介72
4.3流與集合74
4.3.1只能遍歷一次75
4.3.2外部迭代與內(nèi)部迭代76
4.4流操作78
4.4.1中間操作78
4.4.2終端操作79
4.4.3使用流80
4.5小結(jié)81
第5章使用流82
5.1篩選和切片83
5.1.1用謂詞篩選83
5.1.2篩選各異的元素83
5.1.3截短流84
5.1.4跳過(guò)元素85
5.2映射86
5.2.1對(duì)流中每一個(gè)元素應(yīng)用函數(shù)86
5.2.2流的扁平化87
5.3查找和匹配90
5.3.1檢查謂詞是否至少匹配一個(gè)元素90
5.3.2檢查謂詞是否匹配所有元素90
5.3.3查找元素91
5.3.4查找及時(shí)個(gè)元素92
5.4歸約92
5.4.1元素求和93
5.4.2較大值和最小值94
5.5付諸實(shí)踐97
5.5.1領(lǐng)域:交易員和交易98
5.5.2解答99
5.6數(shù)值流101
5.6.1原始類型流特化101
5.6.2數(shù)值范圍102
5.6.3數(shù)值流應(yīng)用:勾股數(shù)103
5.7構(gòu)建流105
5.7.1由值創(chuàng)建流106
5.7.2由數(shù)組創(chuàng)建流106
5.7.3由文件生成流106
5.7.4由函數(shù)生成流:創(chuàng)建無(wú)限流107
5.8小結(jié)110
第6章用流收集數(shù)據(jù)111
6.1收集器簡(jiǎn)介112
6.1.1收集器用作高級(jí)歸約112
6.1.2預(yù)定義收集器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多級(jí)分組121
6.3.2按子組收集數(shù)據(jù)122
6.4分區(qū)126
6.4.1分區(qū)的優(yōu)勢(shì)126
6.4.2將數(shù)字按質(zhì)數(shù)和非質(zhì)數(shù)分區(qū)128
6.5收集器接口129
6.5.1理解Collector接口聲明的方法130
6.5.2全部融合到一起134
6.6開發(fā)你自己的收集器以獲得更好的性能135
6.6.1僅用質(zhì)數(shù)做除數(shù)136
6.6.2比較收集器的性能139
6.7小結(jié)140
第7章并行數(shù)據(jù)處理與性能141
7.1并行流141
7.1.1將順序流轉(zhuǎn)換為并行流142
7.1.2測(cè)量流性能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拆分過(guò)程155
7.3.2實(shí)現(xiàn)你自己的Spliterator157
7.4小結(jié)162
第三部分 高效Java 8編程
第8章重構(gòu)、測(cè)試和調(diào)試164
8.1為改善可讀性和靈活性重構(gòu)代碼164
8.1.1改善代碼的可讀性165
8.1.2從匿名類到Lambda表達(dá)式的轉(zhuǎn)換165
8.1.3從Lambda表達(dá)式到方法引用的轉(zhuǎn)換166
8.1.4從命令式的數(shù)據(jù)處理切換到Stream167
8.1.5增加代碼的靈活性168
8.2使用Lambda重構(gòu)面向?qū)ο蟮脑O(shè)計(jì)模式170
8.2.1策略模式171
8.2.2模板方法172
8.2.3觀察者模式173
8.2.4責(zé)任鏈模式175
8.2.5工廠模式177
8.3測(cè)試Lambda表達(dá)式178
8.3.1測(cè)試可見Lambda函數(shù)的行為179
8.3.2測(cè)試使用Lambda的方法的行為179
8.3.3將復(fù)雜的Lambda表達(dá)式分到不同的方法180
8.3.4高階函數(shù)的測(cè)試180
8.4調(diào)試181
8.4.1查看棧跟蹤181
8.4.2使用日志調(diào)試183
8.5小結(jié)184
第9章默認(rèn)方法 185
9.1不斷演進(jìn)的API 187
9.1.1初始版本的API188
9.1.2第二版API188
9.2概述默認(rèn)方法190
9.3默認(rèn)方法的使用模式192
9.3.1可選方法192
9.3.2行為的多繼承192
9.4解決沖突的規(guī)則196
9.4.1解決問題的三條規(guī)則196
9.4.2選擇提供了具體實(shí)現(xiàn)的默認(rèn)方法的接口197
9.4.3沖突及如何顯式地消除歧義198
9.4.4菱形繼承問題200
9.5小結(jié)201
第10章用Optional取代null202
10.1如何為缺失的值建模 203
10.1.1采用防御式檢查減少Null-PointerException203
10.1.2null帶來(lái)的種種問題204
10.1.3其他語(yǔ)言中null的替代品205
10.2Optional類入門206
10.3應(yīng)用Optional的幾種模式 207
10.3.1創(chuàng)建Optional對(duì)象208
10.3.2使用map從Optional對(duì)象中提取和轉(zhuǎn)換值208
10.3.3使用flatMap鏈接Optional對(duì)象209
10.3.4默認(rèn)行為及解引用Optional對(duì)象213
10.3.5兩個(gè)Optional對(duì)象的組合213
10.3.6使用filter剔除特定的值214
10.4使用Optional的實(shí)戰(zhàn)示例 216
10.4.1用Optional封裝可能為null的值216
10.4.2異常與Optional的對(duì)比217
10.4.3把所有內(nèi)容整合起來(lái)218
10.5小結(jié)219
第11章CompletableFuture:組合式異步編程220
11.1Future接口222
11.1.1Future接口的局限性223
11.1.2使用CompletableFuture構(gòu)建異步應(yīng)用223
11.2實(shí)現(xiàn)異步API 224
11.2.1將同步方法轉(zhuǎn)換為異步方法225
11.2.2錯(cuò)誤處理227
11.3讓你的代碼免受阻塞之苦228
11.3.1使用并行流對(duì)請(qǐng)求進(jìn)行并行操作229
11.3.2使用CompletableFuture發(fā)起異步請(qǐng)求230
11.3.3尋找更好的方案232
11.3.4使用定制的執(zhí)行器233
11.4對(duì)多個(gè)異步任務(wù)進(jìn)行流水線操作234
11.4.1實(shí)現(xiàn)折扣服務(wù)235
11.4.2使用Discount服務(wù)236
11.4.3構(gòu)造同步和異步操作237
11.4.4將兩個(gè)Completable-Future對(duì)象整合起來(lái),無(wú)論它們是否存在依賴239
11.4.5對(duì)Future和Completable-Future的回顧241
11.5響應(yīng)CompletableFuture的completion事件242
11.5.1對(duì)價(jià)格查詢器應(yīng)用的優(yōu)化243
11.5.2付諸實(shí)踐244
11.6小結(jié)245
第12章新的日期和時(shí)間API246
12.1LocalDate、LocalTime、Instant、Duration以及Period247
12.1.1使用LocalDate和LocalTime247
12.1.2合并日期和時(shí)間248
12.1.3機(jī)器的日期和時(shí)間格式249
12.1.4定義Duration或Period249
12.2操縱、解析和格式化日期251
12.2.1使用TemporalAdjuster253
12.2.2打印輸出及解析日期-時(shí)間對(duì)象255
12.3處理不同的時(shí)區(qū)和歷法256
12.3.1利用和UTC/格林尼治時(shí)間的固定偏差計(jì)算時(shí)區(qū)257
12.3.2使用別的日歷系統(tǒng)258
12.4小結(jié)259
第四部分 超越Java 8
第13章函數(shù)式的思考262
13.1實(shí)現(xiàn)和維護(hù)系統(tǒng)262
13.1.1共享的可變數(shù)據(jù)263
13.1.2聲明式編程264
13.1.3為什么要采用函數(shù)式編程265
13.2什么是函數(shù)式編程265
13.2.1函數(shù)式Java編程266
13.2.2引用透明性268
13.2.3面向?qū)ο蟮木幊毯秃瘮?shù)式編程的對(duì)比 268
13.2.4函數(shù)式編程實(shí)戰(zhàn)269
13.3遞歸和迭代271
13.4小結(jié)274
第14章函數(shù)式編程的技巧275
14.1無(wú)處不在的函數(shù)275
14.1.1高階函數(shù)275
14.1.2科里化277
14.2持久化數(shù)據(jù)結(jié)構(gòu)278
14.2.1破壞式更新和函數(shù)式更新的比較279
14.2.2另一個(gè)使用Tree的例子281
14.2.3采用函數(shù)式的方法282
14.3Stream的延遲計(jì)算283
14.3.1自定義的Stream 283
14.3.2創(chuàng)建你自己的延遲列表286
14.4模式匹配290
14.4.1訪問者設(shè)計(jì)模式291
14.4.2用模式匹配力挽狂瀾292
14.5雜項(xiàng)295
14.5.1緩存或記憶表295
14.5.2“返回同樣的對(duì)象”意味著什么296
14.5.3結(jié)合器296
14.6小結(jié)297
第15章面向?qū)ο蠛秃瘮?shù)式編程的混合:Java 8和Scala的比較 299
15.1Scala簡(jiǎn)介300
15.1.1你好,啤酒300
15.1.2基礎(chǔ)數(shù)據(jù)結(jié)構(gòu):List、Set、Map、Tuple、Stream以及Option302
15.2函數(shù)306
15.2.1Scala中的一等函數(shù)307
15.2.2匿名函數(shù)和閉包307
15.2.3科里化309
15.3類和trait310
15.3.1更加簡(jiǎn)潔的Scala類310
15.3.2Scala的trait與Java 8的接口對(duì)比311
15.4小結(jié)312
第16章結(jié)論以及Java的未來(lái)313
16.1回顧Java 8的語(yǔ)言特性 313
16.1.1行為參數(shù)化(Lambda 以及方法引用)314
16.1.2流314
16.1.3CompletableFuture315
16.1.4Optional315
16.1.5默認(rèn)方法316
16.2Java 的未來(lái)316
16.2.1集合316
16.2.2類型系統(tǒng)的改進(jìn)317
16.2.3模式匹配318
16.2.4更加豐富的泛型形式319
16.2.5對(duì)不變性的更深層支持321
16.2.6值類型322
16.3寫在的話325
附錄A其他語(yǔ)言特性的更新326
附錄B類庫(kù)的更新330
附錄C如何以并發(fā)方式在同一個(gè)流上執(zhí)行多種操作338
附錄DLambda表達(dá)式和JVM 字節(jié)碼346
“這是一部十分杰出且簡(jiǎn)明的著作,書中提供了大量的示例,能幫助你迅速地掌握J(rèn)ava 8中的新特性。”——Jason Lee,甲骨文公司“這是超棒的Java 8指南!”——William Wheeler,ProData Computer Systems公司
“這本書中有關(guān)新的Stream API及Lambda表達(dá)式的示例非常有用。”——Steve Rogers, CGTek公司
“這是所有使用Java 8函數(shù)式特性的程序員都必讀的工具書。”——Mayur S. Patil,麻省理工學(xué)院
還可以吧。
學(xué)習(xí)下,面試用
這本書的內(nèi)容真的很棒,很實(shí)用,印刷還可以,整體感覺很不錯(cuò),當(dāng)當(dāng)?shù)奈锪饕脖容^給力,前一天晚上下單的,第二天就到了
工作上用的到
java8學(xué)起來(lái),內(nèi)容不錯(cuò),繼續(xù)學(xué)習(xí)新技術(shù)
整體感覺不錯(cuò)
很LOL木木木木木木嘟嘟嘟諾記
性價(jià)比很高
很好,很值得學(xué)習(xí)
很好,很不錯(cuò),值得購(gòu)買
不錯(cuò),值得一看
紙張很好!
不錯(cuò),正版
實(shí)惠,買的最劃算的一次
大卡推薦的書,還沒來(lái)得及看,先好評(píng)!
非常滿意 推薦大家購(gòu)買
不錯(cuò)的不錯(cuò)的
函數(shù)式編程
值得擁有,只是翻譯不是太好。
不錯(cuò)啊不錯(cuò)不錯(cuò)不錯(cuò)啊不錯(cuò)不錯(cuò)不錯(cuò)啊不錯(cuò)不錯(cuò)
書很不錯(cuò)!!
很好,包裝好,內(nèi)容也好,學(xué)習(xí)java8的好選擇
真心不錯(cuò),一如既往的manning出版社風(fēng)格,很喜歡
內(nèi)容不錯(cuò),java不斷升級(jí),自身也需要跟上時(shí)代的腳步。
內(nèi)容不錯(cuò),涵蓋了java8的新特性。尤其對(duì)于其lambda表達(dá)式有了直觀的闡述。強(qiáng)烈推薦!
這本書寫的很不錯(cuò),對(duì)于希望掌握java8新特性的開發(fā)人員來(lái)說(shuō)值得一看
學(xué)習(xí)之利器,java8很多特性呢,嗯,是我們,程序員學(xué)習(xí)java8的,一個(gè)很好的,很好的一本入門書。
詳細(xì)介紹了 Java8 的一些新特性,很值得看的一本中高級(jí) Java 書