Kotlin 進階實戰

Kotlin 進階實戰

作者: 沈哲 易龐宙
出版社: 清華大學
出版在: 2021-10-01
ISBN-13: 9787302591207
ISBN-10: 7302591202
裝訂格式: 平裝
總頁數: 408 頁





內容描述


本書詳細介紹了Kotlin語言方方面面的特性,包括各種類型的函數,貫徹本書始終的Lambda表達式,有別於Java的委托、泛型,靈活、簡潔的DSL,常用的語法糖,相比線程更加輕量級的協程,參考RxJava實現的Flow,等等。本書還提供了大量涉及移動端、服務端甚至桌面端的案例,這些案例都是編者使用Kotlin之後的實踐和心得,同時包含很多編者封裝的library,供讀者參考、借鑒和使用。 本書適合有一定Kotlin語法基礎的讀者使用,尤其適合移動端和服務端的開發人員使用,也可以用作大專院校和培訓機構的教學參考書。


目錄大綱


1章  認識Kotlin 1
1.1  Kotlin簡介 1
1.1.1  Kotlin的歷史 1
1.1.2  Kotlin的特性 1
1.2  Kotlin的發展 2
1.2.1  實用主義 2
1.2.2  生態圈 3
1.2.3  逐漸Kotlin化的Java 3
1.3  總結 3
2章  Kotlin的函數與類 4
2.1  函數的基本概念 4
2.1.1  函數的參數 5
2.1.2  函數 8
2.2  Kotlin的類(一) 11
2.2.1  構造函數和初始化塊 12
2.2.2  屬性 15
2.2.3  抽像類 16
2.2.4  嵌套類和內部類 16
2.2.5  枚舉類 17
2.3  Kotlin的類(二) 18
2.3.1  對象聲明和對象表達式 18
2.3.2  伴生對象 19
2.3.3  數據類 20
2.3.4  密封類 23
2.4  總結 24
3章  Kotlin的函數式編程 25
3.1  函數式編程與高階函數 25
3.1.1  函數式編程 25
3.1.2  高階函數 25
3.2  Lambda表達式 29
3.2.1  Java 8的Lambda 29
3.2.2  Kotlin的Lambda語法 31
3.2.3  簡化Kotlin的Lambda表達式 31
3.2.4  方法引用 32
3.2.5  Kotlin支持SAM轉換 33
3.2.6  使用高階函數的例子 34
3.2.7  換個角度看 Lambda表達式 35
3.3  集合、序列和Java中的流 38
3.3.1  集合中的函數式API 38
3.3.2  序列和流 41
3.4  總結 41
4章  內聯函數與擴展函數 42
4.1  內聯函數 42
4.1.1  inline的使用 42
4.1.2  禁用內聯——inline 45
4.1.3  非局部返回以及crossinline的使用 47
4.2  內聯屬性 48
4.2.1  內聯屬性 48
4.2.2  內聯類 48
4.3  擴展函數 48
4.3.1  擴展函數的特性 48
4.3.2  常用標準庫的擴展函數 51
4.4  擴展屬性 56
4.5  總結 60
5章  委託 61
5.1  委託介紹 61
5.1.1  靜態代理 61
5.1.2  動態代理 62
5.2  Kotlin的委託模式和委託屬性 64
5.2.1  委託模式 64
5.2.2  委託屬性 65
5.3  lateinit和by lazy 69
5.4  總結 73
6章  泛型 74
6.1  類型擦除 74
6.1.1  Java泛型的優點 74
6.1.2  Kotlin的泛型 75
6.1.3  Java通過類型擦除支持泛型 75
6.1.4  Kotlin如何獲得聲明的泛型類型 77
6.2  型變 80
6.2.1  類和類型 80
6.2.2  型變 80
6.3  泛型約束、類型投影與星號投影 83
6.3.1  泛型約束 83
6.3.2  類型投影 84
6.3.3  星號投影 84
6.3.4  泛型的應用 85
6.4  總結 86
7章  元編程 87
7.1  元編程 87
7.1.1  元編程介紹 87
7.1.2  元編程的分類 87
7.1.3  根本沒有什麼元編程,從來只有編程而已 88
7.2  Kotlin反概述 88
7.2.1  概述 88
7.2.2  Kotlin反API 89
7.3  Java反和Kotlin反(上) 90
7.3.1  類引用,獲取Class對象 90
7.3.2  構造函數引用,獲取類的構造函數 91
7.3.3  函數引用,獲取類的成員函數 92
7.3.4  屬性引用,獲取類的成員變量 94
7.4  Java反和Kotlin反(下) 96
7.4.1  獲取類的其他信息 96
7.4.2  Java反與Kotlin反的互作性 98
7.5  總結 99
8章  DSL的構建 100
8.1  DSL介紹 100
8.2  構建一個DSL的多種方式 101
8.2.1  帶接收者的函數類型 101
8.2.2  帶接收者的Lambda 101
8.2.3  創建一個自己的DSL 102
8.2.4  將擴展函數改成DSL的方式 104
8.2.5  使用運算符重載實現DSL 105
8.2.6  使用中綴表達式實現DSL 106
8.2.7  Kotlin DSL的實際使用——封裝路由框架的使用 107
8.3  總結 108
9章  常用語法糖與設計模式 110
9.1  運算符重載 110
9.2  中綴表達式 112
9.2.1  在擴展函數中使用中綴表達式 113
9.2.2  在成員函數中使用中綴表達式 113
9.3  作用域函數 114
9.3.1  作用域函數的概念 114
9.3.2  如何優雅地使用作用域函數 114
9.4  Contract契約 118
9.4.1  Contract的概念 119
9.4.2  Contract的特性 119
9.4.3  Contract源碼解析 120
9.4.4  小結 122
9.5  在data class中使用MapStruct 122
9.5.1  data class的copy()為淺拷貝 122
9.5.2  MapStruct簡介 123
9.5.3  在Kotlin中使用MapStruct 123
9.6  更好地使用設計模式 126
9.6.1  單例模式 126
9.6.2  builder模式 127
9.6.3  觀察者模式 128
9.6.4  狀態模式 129
9.7  總結 130
10章  跨平台開發 131
10.1  跨平台的簡單介紹 131
10.1.1  跨平台開發的願景 131
10.1.2  跨平台開發當前的主流技術 131
10.1.3  Kotlin與Flutter的對比 132
10.2  利用Ktor-Client實現跨平台網絡請求 132
10.2.1  什麼是Ktor 132
10.2.2  Ktor-Client的使用 132
10.3  總結 142
11章  協程及其應用 143
11.1  協程的基本概念 143
11.1.1  協程的定義 143
11.1.2  為何要使用協程 143
11.1.3  Kotlin協程的基本概念 148
11.2  Coroutine builders 149
11.2.1  launch和async 149
11.2.2  runBlocking 152
11.3  掛起函數 152
11.3.1  delay 152
11.3.2  yield 153
11.3.3  withContet 154
11.3.4  coroutineScope 156
11.4  協程的上下文和調度 156
11.4.1  協程的調度 156
11.4.2  父子協程 158
11.4.3  多個CoroutineContet進行“+”作 160
11.4.4  CoroutineContet+Job 161
11.5  協程的作用域 CoroutineScope 162
11.5.1  盡量少用GlobalScope 162
11.5.2  安全地使用CoroutineScope 163
11.5.3  在Android中更好地使用Coroutines 163
11.6  Channel機制 164
11.6.1  生產者和消費者 164
11.6.2  管道 165
11.6.3  channel緩衝 167
11.6.4  actor 168
11.6.5  Select表達式 169
11.7  總結 170
12章  Flow的基本使用 171
12.1  Flow的使用 171
12.1.1  Kotlin Flow介紹 171
12.1.2  Flow的基本使用方式 171
12.1.3  Flow的生命週期 176
12.2  Flow和RJava 177
12.2.1  Flow和Sequences 177
12.2.2  Flow和RJava 178
12.3  Flow的異常處理 182
12.3.1  catch作符 182
12.3.2  retry、retryWhen作符 184
12.4  Flow的線程作 185
12.4.1  更為簡化的線程切換 185
12.4.2  flowOn和RJava的observeOn 185
12.4.3  buffer實現並發作 186
12.4.4  並行作 188
12.5  Flow其他的作符 189
12.5.1  轉換作符 189
12.5.2  限制大小的作符 189
12.5.3  終端作符 189
12.5.4  合併作符 190
12.5.5  扁平化作符 193
12.6  總結 195
13章  RJava的新特性及常用作符 198
13.1  RJava入門 198
13.1.1  RJava入門理念 198
13.1.2  RJava的基礎知識 199
13.1.3  RJava的生命週期 201
13.2  RJava 3新特性描述 204
13.2.1  主要特性講解 204
13.2.2  與RJava 2.的區別 204
13.2.3  RJava 3新特性部分詳述 204
13.3  常用作符講解 207
13.3.1  創建作符 207
13.3.2  轉換作符 215
13.3.3  過濾作符 220
13.4  總結 227
14章  RJava的核心機制 229
14.1  ObservableSource、Observable、Observer的同流合污 229
14.2  恐怖的Function機制 230
14.3  線程的決策者Scheduler 231
14.3.1  Scheduler工作核心Worker 232
14.3.2  Scheduler線程池核心RThreadFactory 232
14.3.3  異步實踐例子 233
14.3.4  並行的作 234
14.4  Observeable五兄弟的差異性 235
14.4.1  Observable 235
14.4.2  Flowable 238
14.4.3  Single 239
14.4.4  Completable 240
14.4.5  Maybe 240
14.5  背壓策略 241
14.5.1  MISSING 242
14.5.2  ERROR 242
14.5.3  BUFFER 242
14.5.4  DROP 243
14.5.5  LATEST 243
14.6  總結 243
15章  Jetpack 244
15.1  Jetpack介紹 244
15.1.1  客戶端的架構迭代 244
15.1.2  AAC的功能 246
15.1.3  Android Jetpack 247
15.2  Lifecycle 249
15.2.1  Lifecycle介紹 249
15.2.2  Lifecycle的使用 250
15.2.3  Retrofit結合Lifecycle 253
15.3  ViewModel 254
15.3.1  ViewModel介紹 254
15.3.2  ViewModel的使用 255
15.3.3  使用Kotlin委託屬性創建ViewModel 256
15.3.4  AndroidViewModel 257
15.3.5  ViewModel源碼簡單分析 257
15.4  LiveData 261
15.4.1  LiveData介紹 261
15.4.2  LiveData的使用 262
15.4.3  在ViewModel中使用LiveData 263
15.4.4  LiveData實現Fragment之間的通信 264
15.4.5  LiveData源碼簡單分析 265
15.5  Room的用法 267
15.5.1  Room的基本了解 267
15.5.2  Room的配置與使用 268
15.5.3  常用的SQL作 270
15.5.4  Room的兼容與升級 271
15.5.5  小結 275
15.6  Navigation用法詳解 276
15.6.1  Navigation的配置 276
15.6.2  Navigation的基本使用 277
15.6.3  Navigation原理解析 284
15.6.4  小結 287
15.7  總結 287
16章  Android實戰 288
16.1  構建一個日誌框架 288
16.1.1  Android日誌框架L 288
16.1.2  如何開發一款類似L的日誌框架 289
16.1.3  記錄Android日誌更好的方式 297
16.2  網絡診斷工具 297
16.3  使用Netty構建一個在Android上運行的Web服務器 304
16.3.1  開發背景 304
16.3.2  AndroidServer的特性 304
16.3.3  AndroidServer的設計原理 304
16.3.4  AndroidServer的使用 310
16.4  實現協程版本的EventBus 313
16.4.1  RJava版本的EventBus 313
16.4.2  Kotlin Coroutine版本的EventBus 317
16.4.3  小結 322
16.5  總結 322
17章  響應式開發實戰 323
17.1  封裝一個基於RJava的任務框架RTask 323
17.1.1  RTask奠基石的實現 324
17.1.2  利用奠基石實現多種Task 328
17.1.3  RTask的改進,針對Java、Android平台進行適應 335
17.2  基於Kotlin、RJava實現的有限狀態機 339
17.2.1  狀態機 339
17.2.2  常用的狀態機分類 339
17.2.3  Kotlin開發的FSM 340
17.2.4  應用 351
17.3  Kotlin、RJava以及傳統的機器學習在手機質檢上的應用 353
17.3.1  業務背景 353
17.3.2  設計思路 353
17.3.3  代碼實現以及踩過的坑 355
17.3.4  後續的規劃 361
17.4  總結 361
18章  服務端實戰 362
18.1  使用Ktor快速開發Web項目 362
18.1.1  Ktor介紹 362
18.1.2  Ktor服務端的使用 362
18.1.3  例子 365
18.2  使用WebFlu + R2DBC開發Web項目 369
18.2.1  R2DBC介紹 369
18.2.2  R2DBC的使用 370
18.2.3  小結 376
18.3  使用NetDiscovery開發網絡爬蟲 376
18.3.1  NetDiscovery介紹 376
18.3.2  DSL在爬蟲框架中的使用 379
18.3.3  Kotlin Coroutines在爬蟲框架中的使用 384
18.4  實現智能硬件的遠程控制系統(上) 388
18.4.1  業務背景及遠程控制系統的功能 388
18.4.2  遠程控制系統服務端的設計 388
18.4.3  遠程控制系統的數據流向 389
18.4.4  遠程控制系統服務端的相關代碼 390
18.4.5  遠程控制系統後續的規劃 397
18.5  實現智能硬件的遠程控制系統(下) 397
18.5.1  遠程控制的客戶端介紹 397
18.5.2  Watcher的設計 398
18.5.3  Watcher的核心代碼 399
18.5.4  小結 408
18.6  總結 408


作者介紹


沈  哲,現就職於萬物新生(愛回收),擔任創新中心技術總監,負責AIoT 產品相關的研發工作。
具有多年的服務端、移動端研發經驗,熟悉函數響應式編程,對計算機視覺有一定的研究。
曾負責過一款移動端深度鏈接的產品,日活數千萬,該產品已於2019年初以千萬級別的交易額賣給極光,後更名為極光魔鏈。出版著作《RJava 2. 實戰》。

易龐宙,Android開源愛好者,RTask庫、全面屏適配庫以及一些Android常用開源工具的開發者,CSDN博主。
負責過搜床科技集團Android開發,例如bed、酒店自助入住App開發等,目前就職於廣州極飛科技股份有限公司,擔任高級Android開發工程師。




相關書籍

Delphi XE Handbook: A Guide to New Features in Delphi XE (Paperback)

作者 Marco Cantù

2021-10-01

C#程序設計慕課版

作者 甘勇 尚展壘

2021-10-01

從Java到Web程序設計教程

作者 李偉林

2021-10-01