●第1篇 準備
第1章 了解Kotlin2
1.1 Kotlin能干什麼2
1.2 Kotlin的優勢3
1.3 如何使用本書3
第2章 體驗Kotlin4
2.1 搭建開發環境4
2.1.1 搭建Java的開發環境4
2.1.2 搭建Kotlin的開發環境6
2.2 使用RPHL6
2.2.1 認識RPHL——快速驗證代碼的利器6
2.2.2 實例1:在RPHL中進行四則運算6
2.3 Kotlin的IDE支持7
2.3.1 使用IDEA/Android Studio7
2.3.2 使用Eclipse7
2.4 Kotlin 的構建工具8
2.4.1 使用Maven8
2.4.2 使用Gradle10
2.5 基本概念10
2.5.1 源文件與字節碼文件10
2.5.2 標識符與關鍵字11
2.5.3 語句和代碼塊11
2.5.4 注釋11
2.5.5 main()函數13
2.6 本章小結14
第2篇 入門
第3章 第一次動手16
3.1 實例2:第一個Kotlin腳本——四則運算16
3.1.1 了解Kotlin腳本16
3.1.2 編寫Kotlin腳本16
3.1.3 運行腳本16
3.2 實例3:第一個Kotlin應用——Hello Kotlin17
3.2.1 了解Kotlin應用17
3.2.2 編寫代碼17
3.2.3 編譯代碼17
3.2.4 運行代碼18
3.3 本章小結18
第4章 變量和常量19
4.1 變量19
4.1.1 了解變量19
4.1.2 創建變量19
4.2 常量(值)20
4.2.1 了解常量(值)21
4.2.2 創建常量(值)21
4.3 實例4:對比變量和常量21
4.4 本章小結22
第5章 數據類型23
5.1 了解數據類型分類23
5.2 “數值”類型——表示數字23
5.2.1 數值類型的基本分類23
5.2.2 整型、長整型與短整型24
5.2.3 單精度與雙精度浮點類型26
5.2.4 實例5:用“數值”類型進行轉賬操作27
5.3 “字符”與“字符串”類型——表示文本27
5.3.1 字符類型28
5.3.2 字符串類型——一組字符的集合28
5.3.3 字符串類型的常用方法29
5.3.4 了解字符串模板——在字符串中使用表達式31
5.3.5 實例6:用字符串模板編寫SQL語句32
5.3.6 了解多行文字——原樣輸出多行語句33
5.3.7 實例7:用多行字符串排版文字34
5.4 “字節”類型——表示二進制35
5.5 “布爾”類型——真或假35
5.6 Kotlin的可空類型35
5.6.1 空值——沒有存儲空間35
5.6.2 可空類型——可能是空值,也可能不是36
5.6.3 非空類型——不能為空值37
5.6.4 實例8:用安全操作符避免空指針37
5.7 Kotlin的內置類型結構39
5.7.1 Any類型——所有類的父類39
5.7.2 Unit類型——什麼都不返回39
5.7.3 Nothing類型——什麼都沒有39
5.8 類型轉換與類型判斷40
5.8.1 數值類型轉換40
5.8.2 自動類型轉換40
5.8.3 強制類型轉換41
5.8.4 類型提升41
5.8.5 安全類型轉換41
5.8.6 類型判斷與智能轉換42
5.9 類型別名42
5.10 本章小結43
第6章 操作符44
6.1 認識操作符44
6.操作符44
6.2.1 正負操作符44
6.2.2 自增操作符與自減操作符45
6.2.3 否定操作符45
6.操作符46
6.3.1 四則運算操作符46
6.3.2 復合操作符46
6.3.3 比較操作符47
6.3.4 位運算方法48
6.3.5 貓王操作符49
6.3.6 相等性49
6.3.7 in和!in操作符50
6.3.8 索引操作符51
6.3.9 區間操作符51
6.4 操作符重寫51
6.5 本章小結52
第7章 流程控制53
7.1 條件語句53
7.1.1 if語句53
7.1.2 if表達式55
7.1.3 when語句56
7.1.4 when表達式57
7.1.5 實例9:when語句的多種用法57
7.2 循環語句59
7.2.1 while循環60
7.2.2 for循環61
7.2.3 實例10:用for循環替代while循環62
7.2.4 repeat語句62
7.3 跳轉語句63
7.3.1 continue語句——跳過當前循環63
7.3.2 break語句——停止循環64
7.3.3 實例11:用continue語句和break語句替換標簽65
7.4 本章小結65
第8章 數組類型67
8.1 數組67
8.1.1 了解數組——一組相同類型的數據67
8.1.2 創建數組67
8.1.3 實例12:數組的常用操作70
8.2 多維數組72
8.2.1 了解多維數組——素也是數組72
8.2.2 實例13:用多維數組輸出圖形73
8.3 本章小結74
第9章 集合類型75
9.1 列表(List)類型75
9.1.1 列表——有序的一組數據75
9.1.2 不可變列表75
9.1.3 可變列表77
9.1.4 空列表78
9.1.5 實例14:列表類型的常用方法79
9.2 集(Set)類型82
9.2.1 集——不重復的一組數據82
9.2.2 不可變集82
9.2.3 可變集82
9.2.4 空集84
9.2.5 實例15:集類型的常用方法84
9.3 區間(Range)類型85
9.3.1 了解區間——連續的一組數據85
9.3.2 實例16:區間類型的常用方法87
9.4 序列(Sequence)類型88
9.4.1 了解序列——一組數據88
9.4.2 實例17:序列類型的常用方法88
9.5 本章小結89
第3篇 進階
第10章 映射類型94
10.1 了解映射——通過名字找到值94
10.2 創建不可變映射94
10.3 創建可變映射95
10.4 創建空映射97
10.5 實例18:映射的常用方法97
10.5.1 獲得映射的長度97
10.5.2 通過鍵訪問值97
10.5.3 修改可變映射99
10.5.4 刪除可變映素100
10.5.5 遍歷映射100
10.6 本章小結101
第11章 類與對像102
11.1 函數的概念與使用102
11.1.1 了解函數——重用一組語句102
11.1.2 認識函數的基本結構102
11.2 函數的返回值103
11.2.1 在函數中返回值103
11.2.2 了解返回值的數據類型104
11.2.3 實例19:在函數中同時返回多個值104
11.3 函數的參數105
11.3.1 了解函數的參數105
11.3.2 命名參數106
11.3.3 變參——在無法確定參數個數時使用107
11.3.4 參數的默認值109
11.3.5 單表達式函數109
11.4 類的概念與使用110
11.4.1 了解類——同一種概念的抽像110
11.4.2 類的基本結構110
11.4.3 實例20:定義一個電腦類111
11.5 對像112
11.5.1 了解對像——類的具體實現112
11.5.2 創建對像113
11.5.3 訪問對像的屬性和方法113
11.6 構造方法114
11.6.1 了解構造方法——如何創建對像114
11.6.2 主構造方法與初始化代碼114
11.6.3 副構造方法116
11.7 屬性118
11.7.1 了解屬性和字段118
11.7.2 使用默認的Getter和Setter訪問器119
11.7.3 自定義Getter和 Setter訪問器119
11.7.4 幕後字段121
11.7.5 延遲初始化屬性121
11.7.6 內聯屬性123
11.8 方法123
11.8.1 infix方法123
11.8.2 componentN方法124
11.9 this關鍵字125
11.10 實例21:創建用戶登錄管理繫統126
11.10.1 創建用戶類126
11.10.2 創建用戶管理類128
11.10.3 創建客戶端131
11.11 本章小結132
第12章 類的進階用法133
12.1 嵌套類——在類中定義類133
12.2 內部類——將類作為另一個類的成員134
12.3 對像聲明——單例對像134
12.4 伴生對像——代替靜態成員135
12.4.1 了解伴生對像——類中的單例對像135
12.4.2 伴生對像的應用136
12.5 對像表達式——匿名類137
12.5.1 創建對像表達式137
12.5.2 匿名對像的類型138
12.6 數據類——貧血模型140
12.6.1 創建數據類140
12.6.2 了解內置方法的規則142
12.6.3 了解對像間的復制144
12.7 枚舉類——常量集145
12.7.1 創建枚舉類146
12.7.2 實例22:用枚舉類處理日期147
12.8 密封類150
12.9 本章小結150
第13章 繼承、抽像類與接口152
13.1 繼承152
13.1.1 了解繼承——為現有類增加功能152
13.1.2 什麼樣的類纔能被繼承152
13.1.3 使用繼承153
13.1.4 重寫方法153
13.1.5 重寫屬性154
13.1.6 子類訪問父類成員——super關鍵字155
13.2 抽像類156
13.2.1 了解抽像類——定義模板156
13.2.2 使用抽像類156
13.3 接口157
13.3.1 了解接口157
13.3.2 使用接口158
13.4 is-a關繫159
13.5 重寫規則160
13.6 實例23:用繼承繪制一個手機屏幕161
13.7 本章小結165
第14章 包管理與訪問控制符166
14.1 包——一組相關代碼的集合166
14.1.1 聲明包166
14.1.2 導入包167
14.4.3 默認導入包168
14.2 訪問控制符——控制成員是否可以被訪問168
14.2.1 訪問控制符的分類168
14.2.2 構造方法上的訪問控制符169
14.2.3 類成員上的訪問控制符169
14.3 其他控制符170
14.3.1 open控制符和final控制符171
14.3.2 override控制符171
14.4 本章小結171
第15章 正則表達式172
15.1 正則表達式的作用172
15.2 使用正則表達式172
15.2.1 創建正則表達式對像172
15.2.2 匹配數據173
15.2.3 提取數據173
15.2.4 替換數據174
15.2.5 正則分組174
15.3 實例24:用正則表達式解析網頁175
15.4 本章小結177
第16章 泛型178
16.1 了解泛型178
16.1.1 泛型的概念178
16.1.2 為什麼要有泛型178
16.2 泛型的使用179
16.2.1 泛型函數179
16.2.2 泛型類180
16.3 類型參數約束181
16.3.1 上界的概念181
16.3.2 指定單個上界181
16.3.3 指定多個上界182
16.3.4 隱式上界182
16.4 類型型變183
16.4.1 型變183
16.4.2 在聲明處協變184
16.4.3 在聲明處逆變185
16.4.4 類型參數邊界——在使用處型變186
16.4.5 星號投影186
16.5 類型擦除187
16.5.1 類型擦除的概念187
16.5.2 內聯函數和類型擦除188
16.6 實例25:用泛型實現數據的持久化188
16.7 本章小結191
第4篇 高階
第17章 擴展與委托194
17.1 擴展——為現有類增加功能194
17.1.1 擴展方法194
17.1.2 擴展屬性195
17.1.3 擴展伴生對像196
17.1.4 擴展可空類型196
17.1.5 靜態綁定197
17.2 委托——繼承的替代方案198
17.2.1 使用方法委托198
17.2.2 使用屬性委托200
17.2.3 使用內置的屬性委托201
17.2.4 委托工廠類205
17.3 本章小結207
第18章 函數的高級應用208
18.1 高階函數208
18.1.1 函數類型208
18.1.2 將函數作為參數210
18.1.3 將函數作為返回值210
18.2 匿名函數與函數表達式212
18.3 Lambda表達式212
18.3.1 使用Lambda表達式213
18.3.2 隱式參數 it214
18.3.3 作為參數的Lambda表達式214
18.3.4 在Lambda表達式中返回數據215
18.4 內聯函數216
18.4.1 創建內聯函數217
18.4.2 取消參數內聯218
18.4.3 本地返回與非本地返回218
18.5 尾遞歸函數219
18.6 函數式編程220
18.6.1 map()方法220
18.6.2 flatMap()方法221
18.6.3 zip()方法221
18.6.4 reduce()方法222
18.6.5 fold()方法223
18.6.6 filter()方法223
18.6.7 forEach()方法224
18.6.8 partition()方法224
18.7 實例26:用函數式方法完成數據分析225
18.8 本章小結226
第19章 注解與反射227
19.1 注解——為代碼添加標記227
19.1.1 使用注解227
19.1.2 了解注解參數228
19.1.3 注解目標231
19.1.4注解232
19.2 反射——在程序運行時獲數據234
19.2.1 添加依賴234
19.2.2 使用反射234
19.3 實例27:通過反射和注解完成對像的序列化240
19.4 本章小結246
第20章 異常247
20.1 了解異常247
20.2 異常的處理247
20.2.1 捕獲和處理異常247
20.2.2 了解finally代碼塊和返回值249
20.2.3 處理try表達式中的異常250
20.2.4 拋出異常251
20.3 異常對像253
20.3.1 了解異常對像253
20.3.2 自定義異常類253
20.4 實例28:處理回調中的異常254
20.5 本章小結257
第21章 I/O操作258
21.1 文件操作258
21.1.1 創建一個文件258
21.1.2 刪除一個文件259
21.1.3 創建一個目錄259
21.1.4 刪除一個目錄259
21.2 流操作259
21.2.1 流的分類259
21.2.2 寫文件260
21.2.3 讀取文件261
21.3 實例29:讀取並解析CSV文件262
21.4 本章小結265
第22章 DSL266
22.1 DSL的基礎知識266
22.1.1 了解領域特定語言266
22.1.2 了解DSL的常見使用場景266
22.1.3 了解DSL的分類267
22.2 使用DSL267
22.2.1 實例30:用Lambda表達式實現DSL267
22.2.2 實例31:用鏈式調用實現DSL269
22.3 內置DSL270
22.4 本章小結271
第23章 異步編程272
23.1 線程與進程272
23.2 線程的使用272
23.3 了解協程274
23.4 協程的使用274
23.4.1 配置依賴274
23.4.2 協程構建器——創建協程275
23.4.3 Job類——控制協程277
23.4.4 協程狀態和協程取消278
23.5 掛起函數284
23.6 async函數與await()方法285
23.6.1 async()函數285
23.6.2 await()方法287
23.7 協程上下文與協程調度器287
23.7.1 上下文與調度器287
23.7.2 使用協程調度器289
23.8 協程作用域290
23.8.1 協程的父子關繫290
23.8.2 協程中的異常291
23.9 調試協程292
23.10 本章小結293
第24章 與Java之間的調用295
24.1 用Kotlin調用Java程序295
24.1.1 標識符295
24.1.2 類型映射296
24.1.3 可空類型與平臺類型298
24.1.4 Setter與Getter方法299
24.1.5 Object類300
24.1.6 靜態成員301
24.1.7 SAM類型302
24.1.8 泛型303
24.1.9 檢查異常303
24.1.10 JNI304
24.2 用Java調用Kotlin程序304
24.2.1 屬性304
24.2.2 可空類型305
24.2.3 實例字段305
24.2.4 類字段306
24.2.5 靜態方法307
24.2.6 訪問控制符308
24.2.7 KClass308
24.2.8 方法重載308
24.2.9 頂層成員309
24.2.10 @JvmName注解310
24.2.11 型變312
24.2.12 檢查異常312
24.3 本章小結313
第5篇 項目實戰
第25章 用Kotlin編寫“圖書管理繫統”的後端應用316
25.1 建立Spring Boot工程316
25.2 實現Persistence層319
25.3 實現Resource層326
25.4 實現Service層330
25.5 允許跨域訪問333
25.6 運行代碼333
第26章 用Kotlin編寫“圖書管理繫統”的Android應用335
26.1 建立Android工程335
26.2 配置工程338
26.3 編寫Layout文件341
26.4 編寫業務模型344
26.5 創建Sevice345
26.6 創建UI346
26.7 運行工程350
第27章 用Kotlin編寫“圖書管理繫統”的前端應用351
27.1 建立前端工程351
27.2 解析工程352
27.3 調用JavaScript的基礎知識354
27.4 React的基礎知識355
本書是Kotlin跨平臺編程語言的實戰型工具書,全書力求以“簡潔的語言+大量實例”風格進行講解,能夠幫助熟悉Java語言或“零基礎編程”的讀者快速掌握Kotlin。全書共分為5篇,由淺入深,層次遞進地進行講解。第1篇“準備”,介紹了Kotlin語言的基本特性和使用場景;第2篇“入門”,介紹了Kotlin語言中的變量和常量、數據類型、操作符、流程控制、數組類型、集合類型;第3篇“進階”,介紹了映射類型、類與對像、類的進階用法、繼承、抽像類與接口、包管理與訪問控制符、正則表達式、泛型;第4篇“高階”,介紹了擴展與委托、函數的高級應用、注解與反射、異常、I/O操作、DSL、異步編程、與Java之間的調用;第5篇“項目實戰”,主要介紹了使用Kotlin語言來編寫一個圖書管理繫統的後端應用、Android應用、前端應用。本書適合所有對Kotlin語言感興趣的讀者。無論讀者之前是否有過Kotlin經驗等