本書講述了如何從Java過渡到Kotlin,主要關(guān)注代碼,每章都闡述了從Java過渡到Kotlin的一個方面,考察了典型Java項目在這個過程中可以改進的方面。比如,從Optional到nullable,從Bean到值,從開放類到密封類。每章首先解釋關(guān)鍵概念,然后展示如何在保持互操作性的前提下,逐步且安全地將生產(chǎn)型Java代碼重構(gòu)為慣用的Kotlin代碼,由此產(chǎn)生的代碼更簡單、更有表現(xiàn)力,也更容易修改。在本書結(jié)束時,你將有信心將Java代碼重構(gòu)為Kotlin代碼,從頭開始編寫Kotlin代碼,并隨著時間的推移管理一個混合語言代碼庫。
Java到Kotlin的代碼重構(gòu)不是一蹴而就的。如果你是一名有經(jīng)驗的Java開發(fā)人員,并嘗試過Kotlin語言,則可能用不了多久就能步入正軌。
你會發(fā)現(xiàn),Kotlin的“做事方式”有所不同——可空性很重要,集合是不同的,類默認是final。Kotlin的功能更強,意味著什么呢?它將如何改變編程方式?那些仍然需要支持的Java代碼怎么辦?
本書作者在2015年第一次接觸將Java重構(gòu)為Kotlin,此后他們幫助許多團隊和個人致力于此。本書介紹如何從Java過渡到Kotlin,主要關(guān)注代碼,每章都闡述了這種過渡的一個方面,考察了典型Java項目可以改進的方面,比如從Optional到nullable,從Bean到值,以及從開放類到密封類。每章首先解釋關(guān)鍵概念,然后展示如何在保持互操作性的前提下,逐步且安全地將生產(chǎn)型Java代碼重構(gòu)為慣用的Kotlin代碼,由此產(chǎn)生的代碼更簡單、更有表現(xiàn)力,也更容易更改。
在本書結(jié)束時,你將有信心將Java代碼重構(gòu)為Kotlin代碼,從頭開始編寫Kotlin代碼,并隨著時間的推移管理一個混合語言代碼庫。
目錄
前言1
第1章 引言9
1.1 編程語言的“紋理”9
1.2 Java編程風格的主觀歷史12
1.3 Kotlin的“紋理”16
1.4 重構(gòu)為Kotlin18
1.5 我們要做什么20
1.6 啟程20
第2章 從Java項目到Kotlin項目21
2.1 策略21
2.2 在Java構(gòu)建中添加對Kotlin的支持22
2.3 繼續(xù)前進 26
第3章 從Java類到Kotlin類27
3.1 一個簡單的值類型27
3.2 數(shù)據(jù)類的局限性33
3.3 繼續(xù)前進38
第4章 從Optional到nullable39
4.1 表示缺失39
4.2 從Optional重構(gòu)為nullable41
4.3 重構(gòu)為慣用的Kotlin代碼48
4.4 繼續(xù)前進54
第5章 從Bean到值55
5.1 Bean55
5.2 值56
5.3 為什么值類型更受歡迎56
5.4 將Bean重構(gòu)為值57
5.5 繼續(xù)前進64
第6章 從Java集合到Kotlin集合65
6.1 Java集合65
6.2 Kotlin集合68
6.3 將Java集合重構(gòu)為Kotlin集合71
6.4 繼續(xù)前進79
第7章 從action到calculation80
7.1 函數(shù)80
7.2 calculation81
7.3 action82
7.4 為什么要關(guān)注action和calculation83
7.5 為什么選擇calculation84
7.6 將action重構(gòu)為calculation84
7.7 繼續(xù)前進97
第8章 從靜態(tài)方法到頂層函數(shù)98
8.1 Java 中的靜態(tài)方法98
8.2 Kotlin頂層函數(shù)、對象和伴生對象99
8.3 將靜態(tài)方法重構(gòu)為頂層函數(shù)100
8.4 移到頂層104
8.5 Kotlin化105
8.6 繼續(xù)前進107
第9章 從多表達式函數(shù)到單表達式函數(shù) 108
9.1 第1種方式:內(nèi)聯(lián)110
9.2 第2種方式:引入函數(shù)111
9.3 第3種方式:使用let塊115
9.4 第4種方式:后退一步117
9.5 繼續(xù)前進120
第10章 從函數(shù)到擴展函數(shù)121
10.1 函數(shù)和方法121
10.2 擴展函數(shù)123
10.3 擴展和函數(shù)類型124
10.4 擴展屬性125
10.5 類型轉(zhuǎn)換125
10.6 可空參數(shù)127
10.7 可空接收器128
10.8 泛型130
10.9 作為方法的擴展函數(shù)131
10.10 重構(gòu)為擴展函數(shù)131
10.11 繼續(xù)前進145
第11章 從方法到屬性146
11.1 字段、訪問器和屬性146
11.2 如何選擇150
11.3 可變屬性151
11.4 重構(gòu)為屬性152
11.5 繼續(xù)前進156
第12章 從函數(shù)到運算符157
12.1 基礎(chǔ)類:Money 157
12.2 添加用戶定義的運算符159
12.3 從現(xiàn)有Kotlin代碼中調(diào)用運算符160
12.4 現(xiàn)有Java類的運算符162
12.5 表示值的約定 163
12.6 繼續(xù)前進166
第13章 從流到可迭代對象再到序列167
13.1 Java流167
13.2 Kotlin可迭代對象169
13.3 Kotlin序列170
13.4 多重迭代171
13.5 在流、可迭代對象和序列之間進行選擇174
13.6 代數(shù)變換175
13.7 將流重構(gòu)為可迭代對象和序列178
13.8 繼續(xù)前進190
第14章 從可累積對象到轉(zhuǎn)換對象191
14.1 使用累加器進行參數(shù)計算191
14.2 重構(gòu)為基于不可變數(shù)據(jù)的函數(shù)195
14.3 再來一次201
14.4 豐富所發(fā)現(xiàn)的抽象204
14.5 繼續(xù)前進206
第15章 從封裝集合到類型別名207
15.1 組合領(lǐng)域集合209
15.2 具有其他屬性的集合210
15.3 重構(gòu)封裝集合210
15.4 繼續(xù)前進221
第16章 從接口到函數(shù)222
16.1 面向?qū)ο蟮姆庋b223
16.2 函數(shù)式封裝226
16.3 Java中的函數(shù)類型229
16.4 混合和匹配231
16.5 面向?qū)ο蠛秃瘮?shù)式的對比235
16.6 耦合238
16.7 面向?qū)ο筮是函數(shù)式239
16.8 Java的遺留問題242
16.9 可追溯性242
16.10 將接口重構(gòu)為函數(shù)243
16.11 繼續(xù)前進249
第17章 從Mock到Map250
17.1 用Map替代Mock252
17.2 我們真的擺脫了Mock嗎257
17.3 繼續(xù)前進260
第18章 從開放類到密封類261
18.1 多態(tài)性還是密封類264
18.2 將接口轉(zhuǎn)換為密封類265
18.3 繼續(xù)前進272
第19章 從Throwing到Returning273
19.1 異常前的錯誤處理274
19.2 異常的錯誤處理276
19.3 Java 和受檢異常276
19.4 Kotlin和異常278
19.5 超越異常:函數(shù)式錯誤處理278
19.6 Kotlin 中的錯誤處理281
19.7 將異常重構(gòu)為錯誤282
19.8 更多修復296
19.9 層級302
19.10 繼續(xù)前進304
第20章 從執(zhí)行I/O操作到傳遞數(shù)據(jù)306
20.1 監(jiān)聽測試306
20.2 從I/O到數(shù)據(jù)308
20.3 高效寫入313
20.4 高效讀取316
20.5 繼續(xù)前進320
第21章 從異常到值321
21.1 識別可能出錯的地方321
21.2 表示錯誤328
21.3 I/O錯誤334
21.4 繼續(xù)前進336
第22章 從類到函數(shù)337
22.1 驗收測試337
22.2 單元測試341
22.3 標題345
22.4 不同的字段分隔符353
22.5 序列359
22.6 從文件中讀取364
22.7 與Commons CSV比較369
22.8 繼續(xù)前進374
第23章 繼續(xù)旅程375
23.1 紋理375
23.2 函數(shù)式思維376
23.3 簡單設(shè)計377
23.4 函數(shù)式編程和文本推理378
23.5 重構(gòu)378
23.6 重構(gòu)和函數(shù)式思維379
參考文獻380