百人牛牛棋牌
Java編程方法論:響應式RxJava與代碼設計實戰
  • 推薦1
  • 收藏6
  • 瀏覽798

Java編程方法論:響應式RxJava與代碼設計實戰

知秋(李飛) , 李飛 (作者) 

  • 叢  書:Java編程方法論系列叢書
  • 書  號:978-7-121-36417-4
  • 出版日期:2019-06-01
  • 頁  數:296
  • 開  本:16(185*235)
  • 出版狀態:正在印刷
  • 維護人:付睿
本書對RxJava 2的源碼進行了深入解讀,讓讀者可以從設計到實現細節上全面了解它,從而達到不僅會用而且可以進行RxJava 2源碼庫組件級別的拓展的程度。本書的目的不僅是介紹RxJava 2,而且更希望通過一個成熟、優秀的代碼庫來向讀者展示閱讀源碼的思路及編程方面的技巧,其中包含了并發編程的實戰技巧、數據結構的設計方法、設計模式的使用方法、函數式編程的各種技巧等,希望讀者可以深入思考并獲得屬于自己的一套編程方法論。這也是“Java編程方法論系列叢書”的初衷,授之以魚不如授之以漁。
本書適合有Java編程基礎的中高級Java開發工程師、想要學習代碼設計思路與技巧的讀者、對響應式編程感興趣的讀者閱讀。
響應式是未來的編程趨勢,本書是講解響應式技術RxJava 2的書籍,在進行源碼導讀的同時,也引導讀者對代碼設計進行思考。包含大量案例,并配有相關視頻。
知秋,本名李飛,長期致力于基礎代碼庫的研發工作,通過博客與視頻平臺bilibili,結合自己的經驗做了大量源碼解讀的分享。對JDK、Spring、RxJava、Spring Reactor、Netty、Reactor-Netty等有很深刻的研究和獨到的見解,并以此打造“Java編程方法論系列叢書”。基于開源精神,與志同道合的伙伴們一起創建了simviso開源分享團隊,為開源社區服務。
前 言

本書是“Java編程方法論系列叢書”的第一本書,“Java編程方法論系列叢書”將我多年的代碼經驗通過講述優秀的RxJava 2、Reactor 3、Reactor-Netty與Spring WebFlux等框架庫的源碼細節展現出來,目的是讓大家可以學習一種讀源碼的方式。也就是說,看源碼不僅要看懂它干了什么,而且更應該看相關源碼的設計思路以及技巧。這就好比研讀一篇好文章一樣,要揣摩作者的行文方式。
與理解代碼相比,我更愿意帶給大家的是一種生活態度。Java的第一個身份是語言,語言是用于描述我們的思想和生活的,所以帶著生活中的理念來讀源碼,你就會發現情況大為不同:各種編程技巧和實現思路通通擺在了你的眼前。本系列叢書就是從這個角度出發的,所以針對的讀者是那些想要提高自己對于基礎代碼掌控能力的中高級程序員。
下面具體介紹一下本書內容。本書主要講解了到底什么是響應式,從代碼設計層面將JDK 9+中的Flow API、RxJava 2中關于源的創建,以及調度與背壓等相關核心操作娓娓道來,并通過實戰案例幫助大家更好地理解和使用相關的API。本書涉及了大量并發編程方面的技巧,以及從基礎代碼角度介紹了各種接口、設計模式和與之相關的基礎知識點,并將它們融會貫通。這就好比我們上學的時候,老師向我們傳授基礎知識,然后通過習題讓我們掌握這些基礎知識的運用技巧。本書也遵循了這個思路,同時這也符合我寫書的初衷。
限于篇幅,有些內容沒能完全在書中呈現,為了降低圖書的閱讀理解難度,我專門錄制了相關的分享視頻,可以更直觀地帶領大家走進源碼世界。視頻可以說是圖書的有益補充,歡迎大家觀看、學習。另外,希望讀者通過學習本書了解響應式編程如何帶來程序性能的提升以及其正確的使用方式。在錄制本系列叢書的另一本書《Java編程方法論:響應式Reactor 3、Reactor-Netty和Spring WebFlux》(后續出版)的相關視頻時,使我感到很榮幸的是,視頻得到了Spring官方的肯定,并在Spring官方推特和博客上進行了宣傳、推廣,這增加了我對本系列叢書的信心。
最后,感謝尹相宇同學,沒有你聽我啰啰唆唆地講代碼,我估計自己的這份激情難以維持,當然,這本書的順利出版也離不開你的審閱。另外,需要感謝的還有付睿編輯,她幫助我修正了很多表達細節上的錯誤。最后,感謝我的家人對我的理解和默默付出。

知秋(李飛)
2019年2月15日

目錄

第1章 響應式編程總覽(Reactive Programming) 1
1.1 異步編程模式 1
1.1.1 并發 2
1.1.2 并行開發初探 3
1.2 流(Stream) 3
1.3 響應式流(Reactive Stream) 4
1.3.1 響應式流的特性 4
1.3.2 響應式開發的設計原則 5
1.3.3 響應式開發的好處 6
1.4 響應式開發工具庫 6
1.4.1 RxJava簡介 6
1.4.2 Reactor簡介 7
1.4.3 MongoDB簡介 8
1.4.4 響應式項目用例 8
1.5 Java 9中的響應式編程 10
1.5.1 響應式編程接口 10
1.5.2 Java 9響應式編程入門Demo 12
1.5.3 SubmissionPublisher類的源碼解讀 18
1.5.4 響應式編程整合Spring實戰案例 23
1.6 小結 29
第2章 在RxJava中創建Observable 30
2.1 響應式編程所涉及的設計模式 30
2.1.1 觀察者模式 30
2.1.2 迭代器模式 30
2.2 解讀reactivex.Observable 31
2.2.1 從Flow.Publisher到Observable 33
2.2.2 subscribe的二三事 33
2.2.3 create方法的設計思想 36
2.2.4 各式各樣的Observable 40
2.2.5 Observable.cache 43
2.2.6 無限流 49
2.2.7 在Observable內處理錯誤 54
2.2.8 定時控制Observable發送數據 56
2.2.9 Disposable延伸 59
2.2.10 ConnectableObservable解讀 67
2.2.11 Observable中的publish.refCount解讀 76
2.2.12 RxJava中的Subject解讀 79
2.3 小結 89
第3章 RxJava 2中的操作 90
3.1 核心操作 90
3.1.1 使用filter進行條件過濾 90
3.1.2 使用map進行元素轉換 96
3.1.3 使用flatMap進行扁平化轉換 98
3.1.4 使用scan累加器 112
3.1.5 使用groupBy進行分組 114
3.2 多個Observable的合并操作 122
3.2.1 使用merge對Observable進行合并 122
3.2.2 使用zip方法進行合并 124
3.2.3 combineLatest操作 135
3.2.4 withLatestFrom操作 141
3.2.5 amb操作 142
3.3 高級操作 143
3.3.1 再談累加器scan 143
3.3.2 聚合操作reduce 144
3.3.3 收集操作collect 146
3.3.4 使用distinct去重 148
3.3.5 使用distinctUntilChanged過濾重復數據 152
3.3.6 其他操作 152
3.3.7 自定義操作 153
3.4 小結 159
第4章 對RxJava 2的設計探索 160
4.1 源的創建設計思路 160
4.2 中間操作的轉承 162
4.3 小結 166
第5章 Observable實戰 167
5.1 初版架子實現 167
5.1.1 DAO層面的處理工作 167
5.1.2 控制層的響應式實現 172
5.2 基于架子實現一個匯率查詢的服務 175
5.3 rxjava-web-spring-boot-starter的抽取設計 179
5.4 ObservableSseEmitter的設計實現 188
5.5 小結 196
第6章 RxJava 2中的多線程操作 197
6.1 初探RxJava并發編程 197
6.2 subscribeOn操作 211
6.3 observeOn操作 216
6.4 unsubscribeOn操作 220
6.5 調度器Scheduler 226
6.5.1 Schedulers.newThread方式 227
6.5.2 Schedulers.io方式 227
6.5.3 Schedulers.computation方式 228
6.5.4 Schedulers.from(Executor executor)自定義方式 228
6.6 小結 230
第7章 Flowable與背壓 231
7.1 回顧背壓 231
7.2 引入Flowable 233
7.3 探索Flowable.create 234
7.3.1 BackpressureStrategy.BUFFER策略 239
7.3.2 BackpressureStrategy.LATEST策略 246
7.3.3 BackpressureStrategy.DROP策略 249
7.4 將一個Observable轉化為一個Flowable 251
7.5 通過onBackpressureXXX操作來實現背壓策略 252
7.5.1 onBackPressureBuffer操作 255
7.5.2 onBackpressureLatest與onBackpressureDrop操作 256
7.6 Flowable.generate操作 257
7.7 小結 262
第8章 Flowable實戰 263
8.1 使用Flowable封裝JDBC 263
8.1.1 封裝部分查詢邏輯 263
8.1.2 封裝update邏輯 265
8.2 結合Spring Web應用使用Flowable 268
8.2.1 接口數據的獲取 269
8.2.2 響應式服務的源設計 271
8.3 單元測試 274
8.3.1 使用Mock Service Server進行測試 274
8.3.2 使用@Mock來進行一些服務測試 277
8.4 controller層的實現邏輯改造 279
8.5 小結 282

本書勘誤

印次
  • 頁碼:14  •  行數:22  •  印次: 20190601
    public void subscribe(...) {
           subscriber.onSubscribe(new okcerXDemoSubscription(subscriber, executor));
    }
    

    在 有字的22行中,new 對象 的時候,少一個字母 D,請查驗。

    小獵人 提交于 2019/6/23 16:40:43
    付睿 確認于 2019/7/26 14:52:20
  • 頁碼:48  •  行數:24  •  印次: 1

    Object[] currentBuffer;和 int currentIndexInBuffer;兩個字段 …
    其實本書這種很多這種格式的既然都是在正文中了,代碼的末尾的分號總是多余的,讓閱讀的思路到分號就斷開了,非常不爽的感覺。建議將書中正文部分(非代碼塊)的這里的分號最好去掉,閱讀起來不流暢,很奇怪

    longyc2010 提交于 2019/8/11 20:18:35
    付睿 確認于 2019/11/12 15:20:20

讀者評論

推薦用戶

同系列書

相關圖書

Java持續交付

Daniel Bryant (作者) 張若飛 (譯者)

隨著Java 8的發布,以及Spring引導等web/微服務框架的可用性,設計和實現Java驅動的應用程序從來都不是一個更好的時機。但是,在不斷向生產環境交付工...

¥119.00

讀故事學編程——Python王國歷險記(雙色)

李偉 (作者)

這是一本故事書,也是一本編程書。<br>小男孩派森無意中闖入神秘國度—Python 王國,恰好遇到了國王的鸚鵡,于是他們開始了奇幻的冒險之旅。在這個過程中,他們...

¥69.00

21天學通HTML5+CSS3(第2版)

張啟玉 劉剛 (作者)

本書全面、系統、深入地講解了HTML5+CSS3網頁設計與編程的基礎知識與高級應用。在講解過程中,通過大量取自實際操作的案例,將網頁開發知識全面、系統、深入地呈...

¥89.90

尋聲記:Scratch 3.0趣味編程之旅(全彩)

王曉輝 (作者)

本書是一本編程故事書,以Scratch 3.0作為編程設計工具,圍繞一只小貓“喵喵呱” 找回叫聲的故事展開全書內容。  <br>本書包含9章共27節,通篇注重情...

¥69.00

零基礎學Kotlin之Android項目開發實戰

郭寶利 (作者)

系統介紹Kotlin語言基礎,從零基礎介紹起,并給出相關知識點的簡介和網上學習資料索引;圍繞程序員學習時關心的話題介紹一些專題應用,以便程序員將基礎知識點運用好...

¥79.00

程序員代碼面試指南:IT名企算法與數據結構題目最優解(第2版)

左程云 (作者)

《程序員代碼面試指南:IT名企算法與數據結構題目最優解(第2版)》是一本程序員代碼面試寶典!書中對IT名企代碼面試各類題目的最優解進行了總結,并提供了相關代碼實...

¥109.00
百人牛牛棋牌 697932131801614449328587939543791366614367162349365927002301032992479693196115049737912706145294 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();