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