Kotlin 編程實戰 : 創建優雅、富於表現力和高性能的 JVM 與 Android 應用程序 (Programming Kotlin : Create Elegant, Expressive, and Performant Jvm and Android Applications)

Venkat Subramaniam

買這商品的人也買了...

商品描述

本書面向程序員、開發主管、架構師和技術經理。
假定讀者熟悉編程的基礎知識,同時也假定讀者對Java和JDK有一定的了解。
第I部分主要介紹使用Kotlin編寫腳本。
第II部分是關於面向對象的編程。
在第III部分中,你將學習如何使用該語言的函數風格的功能。
第IV部分將把目前為止所學的知識結合起來,使你的代碼更加流暢,並教會你如何創建內部領域特定語言(DSL)。
在第V部分中,你將了解新的協程和異步編程。
第VI部分涉及Java的互操作、測試、使用帶有Spring的Kotlin,以及使用Kotlin編寫Android應用程序。

作者簡介

Venkat Subramaniam博士是一位獲獎作家,Agile Developer公司的創始人,休斯敦大學的教學型教授。
他在北美洲、歐洲和亞洲培訓和指導了數千名軟件開發人員,並定期應邀在國際會議上發言。
他是多本書的作者(合著者),包括2007年獲得Jolt Productivity獎的Practices of an Agile Developer一書。

目錄大綱

本書讚譽

前言
致謝
第1章你好Kotlin1
1.1愛上Kotlin的理由2
1.1.1多範式編程3
1.1.2具有類型推斷的靜態類型4
1.2為什麼選擇Kotlin5
1.3帶Kotlin去兜兜風5
1.3.1安裝Kotlin SDK6
1.3.2驗證安裝6
1.4編譯成字節碼並運行7
1.4.1在命令行上運行7
1.4.2在IDE中運行8
1.4.3使用REPL進行實驗8
1.4.4作為腳本運行9
1.5編譯成其他目標11
1.6選擇哪個選項11
1.7本章小結12

第一部分使用Kotlin編寫腳本
第2章從Java角度了解Kotlin的基本知識14
2.1減少輸入15
2.1.1分號是可選的15
2.1.2變量類型規範是可選的15
2.1.3類和函數是可選的17
2.1.4 try-catch是可選的18
2.2合理的警告19
2.3選擇val而不是var20
2.4改進的相等性檢查21
2.5字符串模板23
2.6原始字符串24
2.6.1沒有轉義24
2.6.2多行字符串24
2.7更多的表達式,更少的語句26
2.8本章小結28

第3章使用函數29
3.1創建函數30
3.1.1 KISS函數30
3.1.2返回類型和類型推斷30
3.1.3所有的函數都是表達式31
3.1.4定義參數32
3.1.5帶有塊體的函數33
3.2默認參數和命名參數34
3.2.1演化帶有默認參數的函數34
3.2.2使用命名參數提高可讀性35
3.3 vararg和spread37
3.3.1可變數量的實參37
3.3.2 spread運算符38
3.4解構39
3.5本章小結40

第4章外部迭代和參數匹配42
4.1範圍與迭代43
4.1.1範圍類43
4.1.2正向迭代43
4.1.3反向迭代44
4.1.4跳過範圍內的值44
4.2遍歷數組和列表45
4.3何時應該使用when47
4.3.1 when用作表達式47
4.3.2 when用作語句49
4.3.3 when和變量的作用域49
4.4本章小結50

第5章使用集合51
5.1集合的類型51
5.1.1 Kotlin所添加的便利方法52
5.1.2視圖53
5.2使用Pair和Triple53
5.3對象和基元數組55
5.4使用列表56
5.5使用集合59
5.6使用映射59
5.7本章小結61

第6章使用類型安全性解決問題63
6.1 Any和Nothing類64
6.1.1 Any是基類64
6.1.2 Nothing比void更深入65
6.2可空的引用65
6.2.1 null是件不好的事66
6.2.2使用可空類型67
6.2.3安全調用運算符69
6.2.4 Elvis運算符69
6.2.5不要使用不安全的斷言運算符70
6.2.6使用when71
6.3類型檢查和轉換72
6.3.1類型檢查72
6.3.2使用is72
6.3.3智能轉換73
6.3.4使用帶有when的類型檢查和智能轉換75
6.4顯式類型轉換75
6.5泛型:參數類型的變化和約束77
6.5. 1類型不變性77
6.5.2使用協變79
6.5.3使用逆變81
6.5.4使用where的參數類型約束82
6.5.5星投影83
6.6具體化的類型參數84
6.7本章小結86

第二部分面向對象的Kotlin
第7章對象和類88
7.1對象和單例88
7.1.1帶有對象表達式的匿名對象89
7.1.2帶有對象聲明的單例91
7.1.3函數與單例92
7.2創建類93
7.2.1最小的類94
7.2.2只讀屬性94
7.2.3創建實例94
7.2.4讀寫屬性95
7.2.5底層探秘—字段和屬性95
7.3伴生對象和類成員102
7.3.1類級別成員102
7.3.2訪問同伴103
7.3.3 Companion作為Factory103
7.3.4不是非常靜態的104
7.4創建泛型類105
7.5數據類106
7.6本章小結108

第8章類層次結構和繼承110
8.1創建接口和抽像類110
8.1.1創建接口111
8.1.2創建抽像類113
8.1.3是接口還是抽像類113
8.2嵌套類和內部類114
8.3繼承116
8.4 Sealed類119
8.5創建和使用枚舉120
8.6本章小結122

第9章通過委託進行擴展124
9.1何時選擇委託而不是繼承125
9.2使用委託進行設計126
9.2.1一個設計問題126
9.2.2繼承的錯誤指向127
9.2.3委託—艱難的方式128
9.2.4使用Kotlin的by來進行委託129
9.3委託給一個參數130
9.4處理方法衝突131
9.5 Kotlin委託的注意事項133
9.6委託變量和屬性135
9.6.1委託變量135
9.6.2委託屬性137
9.7內置的標準委託139
9.7.1有點兒懶惰也沒關係140
9.7.2 Observable委託141
9.7.3行使你的可否決權利142
9.8本章小結143

第三部分函數式Kotlin
第10章使用lambda進行函數式編程146
10.1函數式風格146
10.1.1什麼是函數式風格147
10.1.2為什麼以及何時使用函數式風格148
10.2 lambda表達式149
10.2.1 lambda的結構149
10.2. 2傳遞lambda150
10.2.3使用隱式參數151
10.2.4接收lambda151
10.2.5用lambda作為最後一個參數151
10.2.6使用函數引用152
10.2.7函數返回函數154
10.3 lambda和匿名函數155
10.4閉包和詞法作用域157
10.5非局部和帶標籤的return158
10.5.1默認情況下不允許使用return 158
10.5.2帶標籤的return159
10.5.3非局部return161
10.6帶有lambda的內聯函數163
10.6.1默認情況下沒有內聯優化163
10.6.2內聯優化164
10.6.3對參數精心選擇noinline 165
10.6.4內聯lambda中允許非局部return166
10.6.5 crossinline參數167
10.6.6 inline和return的良好實踐168
10.7本章小結169

第11章內部迭代和延遲計算170
11.1外部迭代器與內部迭代器171
11.2內部迭代器172
11.2.1 filter、map和reduce172
11.2.2得到第一個和最後一個174
11.2.3 flatten和flatMap175
11.2. 4排序177
11.2.5將對象進行分組177
11.3延遲計算序列178
11.3.1使用序列提高性能179
11.3.2無限序列181
11.4本章小結183

第四部分優雅且高效的Kotlin
第12章Kotlin的流暢性186
12.1重載運算符187
12.2使用擴展函數和屬性進行注入190
12.2.1使用擴展函數注入方法190
12.2.2使用擴展函數注入運算符191
12.2.3使用擴展屬性注入屬性192
12.2.4注入第三方類192
12.2. 5注入靜態方法195
12.2.6從類內註入195
12.3擴展函數197
12.4帶中綴的函數流暢性198
12.5帶Any對象的流暢性199
12.5.1四種方法的行為200
12.5.2來自冗長和混亂的代碼201
12.5.3使用apply刪除重複的引用202
12.5.4使用run獲得結果203
12.5.5使用let將對像作為參數傳遞203
12.5.6使用also將void函數鏈接起來205
12.6隱式接收方206
12.6 .1傳遞一個接收方206
12.6.2帶接收方的多個作用域207
12.7本章小結209

第13章創建內部DSL210
13.1 DSL的類型和特徵211
13.1.1外部DSL與內部DSL211
13.1.2語境驅動和流暢211
13.2用於內部DSL的Kotlin211
13.2.1分號可選212
13.2.2點和圓括號不與中綴在一起212
13.2.3使用擴展函數獲得特定的域212
13.2.4傳遞lambda不需要圓括號213
13.2.5隱式接收方影響DSL的創建213
13.2.6還有一些特性可以幫助DSL214
13.3構建流暢性方面的挑戰214
13.3.1使用擴展函數215
13.3.2使用接收方和中綴216
13.4類型安全構建器220
13.4.1 HTML構建器220
13.4.2 XML構建器222
13.5使用作用域控制來縮小訪問範圍225
13.6本章小結227

第14章編寫遞歸和記憶228
14.1遞歸的威力和危險228
14.2尾調用優化230
14.3記憶232
14.3.1重複計算233
14.3.2記憶—Kotlin中的Groovy方法234
14.3.3記憶作為委託235
14.4將記憶應用於動態規劃237
14.5本章小結238

第五部分編寫異步應用程序
第15章探索協程242
15.1協程和並發242
15.1.1並行與並發243
15.1.2協程作為協作函數243
15.2使用協程並發運行244
15.2.1從順序執行開始244
15.2.2創建一個協程245
15.2.3啟動一個任務246
15.2.4與掛起點交錯調用247
15.3協程上下文和線程249
15.3.1顯式設置上下文249
15.3.2在自定義池中運行250
15.3.3在掛起點後切換線程251
15.3.4修改CoroutineContext253
15.4調試協程254
15.4.1 async和await255
15.4.2看一眼延續256
15.5創建無限序列258
15.5.1使用序列258
15.5. 2使用iterator函數259
15.6本章小結261

第16章異步編程262
16.1非阻塞異步編程262
16.1.1按順序開始262
16.1.2進行異步264
16.2異常處理266
16.2.1啟動和異常266
16.2.2異步和異常268
16.3取消和超時270
16.3.1取消協程270
16.3.2請勿打擾273
16.3.3雙向取消274
16.3.4監督作業275
16.3.5編程時使用超時276
16.4本章小結277

第六部分互操作和測試
第17章將Java與Kotlin混合使用280
17.1聯合編譯280
17.2從Kotlin調用Java283
17.3從Java調用Kotlin286
17.3.1使用Java中的重載運算符287
17.3.2創建靜態方法288
17.3.3傳遞lambda289
17.3.4添加throws子句290
17.3.5使用帶默認參數的函數292
17.3.6訪問函數293
17.3.7更多註釋294
17.4本章小結294

第18章使用Kotlin進行單元測試296
18.1被測試的代碼296
18.2獲取項目文件297
18.2.1設置Gradle298
18.2.2設置Maven300
18.3從Canary測試開始300
18.4編寫經驗測試301
18.5編寫數據驅動的測試304
18.6模擬依賴項305
18.6.1創建交互測試306
18.6.2測試解析數據308
18.7測試函數310
18.8測試協程和異步調用313
18.9與服務集成316
18.10查看代碼覆蓋率317
18.11將應用程序用於驅動318
18.12本章小結319

第19章使用Kotlin編寫Spring應用程序320
19.1創建一個Starter項目320
19.2創建一個控制器322
19.3創建一個實體類324
19.4創建一個存儲庫接口325
19.5創建一個服務326
19.6將服務與控制器集成327
19.7繼續實踐329
19.8本章小結330

第20章使用Kotlin編寫Android應用程序331
20.1創建一個項目331
20.2定義域對象333
20.3創建佈局335
20.4實施活動337
20.5更新RecyclerView341
20.6查看應用程序的運行情況343
20.7本章小結344
附錄1轉換為JavaScript346
附錄2 Kotlin/Native350
附錄3 Kotlin到WebAssembly353
參考文獻357