通過每一章的練習(xí)快速掌握Java8中的Lambda表達式分析流、高級集合和其他Java8類庫的改進利用多核CPU提高數(shù)據(jù)并發(fā)的性能將現(xiàn)有代碼庫和庫代碼Lambda化學(xué)習(xí)Lambda表達式單元測試和調(diào)試的實踐解決方案用Lambda表達式實現(xiàn)面向?qū)ο缶幊痰腟OLID原則編寫能有效執(zhí)行消息傳送和非阻塞I/O的并發(fā)應(yīng)用。
對于有經(jīng)驗的Java程序員來說,全面了解Java 8引入的Lambda表達式是當(dāng)務(wù)之急。本書作者是資深Java開發(fā)者、英國倫敦Java社區(qū)負責(zé)人,英文原版深受好評,被譽為學(xué)習(xí)Lambda表達式的必讀佳作。這本書言簡意賅,示例精到,全面介紹了因為Lambda表達式的引入,Java這門世界上流行的語言都發(fā)生了哪些重大變化,以及匿名函數(shù)將如何重塑Java的編程范式。全書篇幅不長,環(huán)環(huán)相扣,讀來令人手不釋卷。
函數(shù)式編程的確能大幅提升編程效率,但它也并不高深,絕非少數(shù)人的游戲。本書可以讓所有Java程序員平滑過渡到Java 8時代。前半部分展示了如何正確使用Lambda表達式;后面幾章介紹如何利用Lambda表達式提高并發(fā)操作的性能、編寫出更簡單的并發(fā)代碼。全書采用了示例驅(qū)動的寫作風(fēng)格:每介紹完一個概念,緊接著給出一段示例代碼,并輔以詳盡的講解。多數(shù)章節(jié)還在最后提供了練習(xí)題,供讀者自行練習(xí)。
Richard Warburton,一位經(jīng)驗豐富的技術(shù)專家,善于解決復(fù)雜深奧的技術(shù)問題,擁有華威大學(xué)計算機科學(xué)專業(yè)博士學(xué)位。近期他一直從事高性能計算方面的數(shù)據(jù)分析工作。他是英國倫敦Java社區(qū)的領(lǐng)導(dǎo)者,組織過面向Java 8中Lambda表達式、日期和時間的Adopt-a-JSR項目,以及Openjdk Hackdays活動。Richard還是知名的會議演講嘉賓,曾在JavaOne、DevoxxUK和JAX London等會議上演講。
前言
第1章 簡介
1.1 為什么需要再次修改Java
1.2 什么是函數(shù)式編程
1.3 示例
第2章 Lambda 表達式
2.1 第一個Lambda 表達式
2.2 如何辨別Lambda 表達式
2.3 引用值,而不是變量
2.4 函數(shù)接口
2.5 類型推斷
2.6 要點回顧
2.7 練習(xí)
第3章 流
3.1 從外部迭代到內(nèi)部迭代
3.2 實現(xiàn)機制
3.3 常用的流操作
3.3.1 collect(toList())
3.3.2 map
3.3.3 filter
3.3.4 flatMap
3.3.5 max 和min
3.3.6 通用模式
3.3.7 reduce
3.3.8 整合操作
3.4 重構(gòu)遺留代碼
3.5 多次調(diào)用流操作
3.6 高階函數(shù)
3.7 正確使用Lambda 表達式
3.8 要點回顧
3.9 練習(xí)
3.10 進階練習(xí)
第4章 類庫
4.1 在代碼中使用Lambda 表達式
4.2 基本類型
4.3 重載解析
4.4 @FunctionalInterface
4.5 二進制接口的兼容性
4.6 默認方法
4.7 多重繼承
4.8 權(quán)衡
4.9 接口的靜態(tài)方法
4.10 Optional
4.11 要點回顧
4.12 練習(xí)
4.13 開放練習(xí)
第5章 高級集合類和收集器
5.1 方法引用
5.2 元素順序
5.3 使用收集器
5.3.1 轉(zhuǎn)換成其他集合
5.3.2 轉(zhuǎn)換成值
5.3.3 數(shù)據(jù)分塊
5.3.4 數(shù)據(jù)分組
5.3.5 字符串
5.3.6 組合收集器
5.3.7 重構(gòu)和定制收集器
5.3.8 對收集器的歸一化處理
5.4 一些細節(jié)
5.5 要點回顧
5.6 練習(xí)
第6章 數(shù)據(jù)并行化
6.1 并行和并發(fā)
6.2 為什么并行化如此重要
6.3 并行化流操作
6.4 模擬系統(tǒng)
6.5 限制
6.6 性能
6.7 并行化數(shù)組操作
6.8 要點回顧
6.9 練習(xí)
第7章 測試、調(diào)試和重構(gòu)
7.1 重構(gòu)候選項
7.1.1 進進出出、搖搖晃晃
7.1.2 孤獨的覆蓋
7.1.3 同樣的東西寫兩遍
7.2 Lambda 表達式的單元測試
7.3 在測試替身時使用Lambda 表達式
7.4 惰性求值和調(diào)試
7.5 日志和打印消息
7.6 解決方案:peak
7.7 在流中間設(shè)置斷點
7.8 要點回顧
第8章 設(shè)計和架構(gòu)的原則
8.1 Lambda 表達式改變了設(shè)計模式
8.1.1 命令者模式
8.1.2 策略模式
8.1.3 觀察者模式
8.1.4 模板方法模式
8.2 使用Lambda 表達式的領(lǐng)域?qū)S谜Z言
8.2.1 使用Java 編寫DSL
8.2.2 實現(xiàn)
8.2.3 評估
8.3 使用Lambda 表達式的SOLID 原則
8.3.1 單一功能原則
8.3.2 開閉原則
8.3.3 依賴反轉(zhuǎn)原則
8.4 進階閱讀
8.5 要點回顧
第9章 使用Lambda 表達式編寫并發(fā)程序
9.1 為什么要使用非阻塞式I/O
9.2 回調(diào)
9.3 消息傳遞架構(gòu)
9.4 末日金字塔
9.5 Future
9.6 CompletableFuture
9.7 響應(yīng)式編程
9.8 何時何地使用新技術(shù)
9.9 要點回顧
9.10 練習(xí)
第10章 下一步該怎么辦
封面介紹
在開始探索Lambda表達式之前,首先我們要知道它因何而生。本章將介紹Lambda表達式產(chǎn)生的原因,以及本書的寫作動機和組織結(jié)構(gòu)。
1.1 為什么需要再次修改Java
1996年1月,Java 1.0發(fā)布,此后計算機編程領(lǐng)域發(fā)生了翻天覆地的變化。商業(yè)發(fā)展需要更復(fù)雜的應(yīng)用,大多數(shù)程序都跑在功能強大的多核CPU的機器上。帶有高效運行時編譯器的Java虛擬機(JVM)的出現(xiàn),使程序員將更多精力放在編寫干凈、易于維護的代碼上,而不是思考如何將每一個CPU時鐘周期、每字節(jié)內(nèi)存物盡其用。
多核CPU的興起成為了不容回避的事實。涉及鎖的編程算法不但容易出錯,而且耗費時間。人們開發(fā)了java.util.concurrent包和很多第三方類庫,試圖將并發(fā)抽象化,幫助程序員寫出在多核CPU上運行良好的程序。很可惜,到目前為止,我們的成果還遠遠不夠。
開發(fā)類庫的程序員使用Java時,發(fā)現(xiàn)抽象級別還不夠。處理大型數(shù)據(jù)集合就是個很好的例子,面對大型數(shù)據(jù)集合,Java還欠缺高效的并行操作。開發(fā)者能夠使用Java 8編寫復(fù)雜的集合處理算法,只需要簡單修改一個方法,就能讓代碼在多核CPU上高效運行。為了編寫這類處理批量數(shù)據(jù)的并行類庫,需要在語言層面上修改現(xiàn)有的Java:增加Lambda表達式。
當(dāng)然,這樣做是有代價的,程序員必須學(xué)習(xí)如何編寫和閱讀使用Lambda表達式的代碼,但是,這不是一樁賠本的買賣。與手寫一大段復(fù)雜、線程安全的代碼相比,學(xué)習(xí)一點新語法和一些新習(xí)慣容易很多。開發(fā)企業(yè)級應(yīng)用時,好的類庫和框架極大地降低了開發(fā)時間和成本,也為開發(fā)易用且高效的類庫掃清了障礙。
對于習(xí)慣了面向?qū)ο缶幊痰拈_發(fā)者來說,抽象的概念并不陌生。面向?qū)ο缶幊淌菍?shù)據(jù)進行抽象,而函數(shù)式編程是對行為進行抽象,F(xiàn)實世界中,數(shù)據(jù)和行為并存,程序也是如此,因此這兩種編程方式我們都得學(xué)。
這種新的抽象方式還有其他好處。不是所有人都在編寫性能優(yōu)先的代碼,對于這些人來說,函數(shù)式編程帶來的好處尤為明顯。程序員能編寫出更容易閱讀的代碼——這種代碼更多地表達了業(yè)務(wù)邏輯的意圖,而不是它的實現(xiàn)機制。易讀的代碼也易于維護、更可靠、更不容易出錯。
在寫回調(diào)函數(shù)和事件處理程序時,程序員不必再糾纏于匿名內(nèi)部類的冗繁和可讀性,函數(shù)式編程讓事件處理系統(tǒng)變得更加簡單。能將函數(shù)方便地傳遞也讓編寫惰性代碼變得容易,惰性代碼在真正需要時才初始化變量的值。
Java 8還讓集合類可以擁有一些額外的方法:default方法。程序員在維護自己的類庫時,可以使用這些方法。
總而言之,Java已經(jīng)不是祖輩們當(dāng)年使用的Java了,嗯, 這不是件壞事。
1.2 什么是函數(shù)式編程
每個人對函數(shù)式編程的理解不盡相同。但其核心是:在思考問題時,使用不可變值和函數(shù),函數(shù)對一個值進行處理,映射成另一個值。
不同的語言社區(qū)往往對各自語言中的特性孤芳自賞,F(xiàn)在談Java程序員如何定義函數(shù)式編程還為時尚早,但是,這根本不重要!我們關(guān)心的是如何寫出好代碼,而不是符合函數(shù)式編程風(fēng)格的代碼。
本書將重點放在函數(shù)式編程的實用性上,包括可以被大多數(shù)程序員理解和使用的技術(shù),幫助他們寫出易讀、易維護的代碼。
……