《Kotlin 實(shí)戰(zhàn)》將從語(yǔ)言的基本特性開(kāi)始,逐漸覆蓋其更多的高級(jí)特性,尤其注重講解如何將 Koltin 集成到已有 Java 工程實(shí)踐及其背后的原理。本書(shū)分為兩個(gè)部分。部分講解如何開(kāi)始使用 Kotlin 現(xiàn)有的庫(kù)和API,包括基本語(yǔ)法、擴(kuò)展函數(shù)和擴(kuò)展屬性、數(shù)據(jù)類(lèi)和伴生對(duì)象、lambda 表達(dá)式,以及數(shù)據(jù)類(lèi)型系統(tǒng)(著重講解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 構(gòu)建自己的 API,以及一些深層次特性——約定和委托屬性、高階函數(shù)、泛型、注解和反射,以及領(lǐng)域特定語(yǔ)言的構(gòu)建。《Kotlin 實(shí)戰(zhàn)》適合廣大移動(dòng)開(kāi)發(fā)者及入門(mén)學(xué)習(xí)者,尤其是緊跟主流趨勢(shì)的前沿探索者。
《Kotlin 實(shí)戰(zhàn)》教會(huì)你使用 Kotlin 語(yǔ)言來(lái)開(kāi)發(fā)達(dá)到產(chǎn)品級(jí)品質(zhì)的應(yīng)用。《Kotlin 實(shí)戰(zhàn)》為具備一定 Java 經(jīng)驗(yàn)的開(kāi)發(fā)者編寫(xiě),包含了豐富的示例,和大多數(shù)介紹編程語(yǔ)言的書(shū)籍相比更加深入,涵蓋了非常有趣的話題,例如怎樣構(gòu)建使用自然語(yǔ)言語(yǔ)法的 DSL。兩位作者是 Kotlin 的核心開(kāi)發(fā)者,所以你可以相信書(shū)中細(xì)枝末節(jié)的內(nèi)容都無(wú)比地。
● 在 JVM 上進(jìn)行函數(shù)式編程
● 編寫(xiě)整潔并符合語(yǔ)義習(xí)慣的代碼
● 結(jié)合運(yùn)用 Kotlin 和 Java
● 領(lǐng)域特定語(yǔ)言
作者簡(jiǎn)介
本書(shū)作者為 JetBrains 的 Kotlin 核心開(kāi)發(fā)者!Dmitry Jemerov 從2003年起就在 JetBrains ?作并參與了許多產(chǎn)品的開(kāi)發(fā),包括IntelliJ IDEA、PyCharm 和 WebStorm。他是 Kotlin 最早的貢獻(xiàn)者之?,創(chuàng)建了最初版本的 Kotlin JVM 字節(jié)碼?成器,并且還在世界各地的活動(dòng)上做了很多關(guān)于 Kotlin 的演示。?前他帶領(lǐng)了進(jìn)? Kotlin IntelliJ IDEA 插件開(kāi)發(fā)的團(tuán)隊(duì)。
Svetlana Isakova 從2011年成為 Kotlin 團(tuán)隊(duì)的?員。她從事編譯器類(lèi)型推導(dǎo)和重載解析?系統(tǒng)的?作。現(xiàn)在她是?名技術(shù)布道者,在各種會(huì)議上進(jìn)? Kotlin 相關(guān)討論并從事 Kotlin 在線課程的相關(guān)?作。
譯者簡(jiǎn)介
覃宇,ThoughtWorks 高級(jí)咨詢師,10余年移動(dòng)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn),Android 技術(shù)專家,曾為AOSP貢獻(xiàn)過(guò)測(cè)試用例;目前專注于移動(dòng)應(yīng)用的架構(gòu)設(shè)計(jì)、自動(dòng)化測(cè)試以及持續(xù)交付。
羅麗,高級(jí)軟件工程師,移動(dòng)技術(shù)開(kāi)發(fā)顧問(wèn),擁有豐富的軟件開(kāi)發(fā)經(jīng)驗(yàn), 熟悉React Native,Android,iOS等多種開(kāi)發(fā)技術(shù)。目前任職于ThoughtWorks海外事業(yè)部,曾在多個(gè)大型移動(dòng)應(yīng)用項(xiàng)目中擔(dān)任技術(shù)顧問(wèn)。
李思陽(yáng),ThoughtWorks咨詢師,移動(dòng)開(kāi)發(fā)工程師。熟悉Android、Mobile Web相關(guān)技術(shù),有著豐富的移動(dòng)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn),在移動(dòng)應(yīng)用體驗(yàn)和兼容性相關(guān)領(lǐng)域有獨(dú)特的見(jiàn)解;長(zhǎng)期關(guān)注Android領(lǐng)域相關(guān)技術(shù)動(dòng)向。
蔣揚(yáng)海,ThoughtWorks移動(dòng)開(kāi)發(fā)咨詢師,深耕Android開(kāi)發(fā)多年,應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)豐富,對(duì)Android開(kāi)發(fā)領(lǐng)域的技術(shù)有廣泛的涉獵,對(duì)Android技術(shù)動(dòng)向有著敏銳的洞察力。
第 1 部分 Kotlin 簡(jiǎn)介 1
1 Kotlin :定義和目的 3
1.1Kotlin 初體驗(yàn) 3
1.2Kotlin 的主要特征4
1.2.1目標(biāo)平臺(tái) :服務(wù)器端、Android 及任何 Java 運(yùn)行的地方 4
1.2.2靜態(tài)類(lèi)型5
1.2.3函數(shù)式和面向?qū)ο?6
1.2.4免費(fèi)并開(kāi)源 7
1.3Kotlin 應(yīng)用8
1.3.1服務(wù)器端的 Kotlin8
1.3.2Android 上的 Kotlin 9
1.4Kotlin 的設(shè)計(jì)哲學(xué) 10
1.4.1務(wù)實(shí)10
1.4.2簡(jiǎn)潔 11
1.4.3安全12
1.4.4互操作性 13
1.5使用 Kotlin 工具 14
1.5.1編譯 Kotlin 代碼 14
1.5.2IntelliJ IDEA 和 Android Studio 插件 15
1.5.3交互式 shell15
1.5.4Eclipse 插件 15
1.5.5在線 playground 15
1.5.6Java 到 Kotlin 的轉(zhuǎn)換器 16
1.6小結(jié)16
2 Kotlin 基礎(chǔ) 17
2.1基本要素 :函數(shù)和變量 17
2.1.1Hello,world!18
2.1.2函數(shù)18
2.1.3變量20
2.1.4更簡(jiǎn)單的字符串格式化 :字符串模板 22
2.2類(lèi)和屬性 23
2.2.1屬性24
2.2.2自定義訪問(wèn)器 25
2.2.3Kotlin 源碼布局 :目錄和包26
2.3表示和處理選擇 :枚舉和“when” 28
2.3.1聲明枚舉類(lèi)28
2.3.2使用“when”處理枚舉類(lèi) 29
2.3.3在“when”結(jié)構(gòu)中使用任意對(duì)象 30
2.3.4使用不帶參數(shù)的“when” 31
2.3.5智能轉(zhuǎn)換 :合并類(lèi)型檢查和轉(zhuǎn)換32
2.3.6重構(gòu) :用“when”代替“if” 34
2.3.7代碼塊作為“if”和“when”的分支 35
2.4迭代事物 :“while”循環(huán)和“for”循環(huán) 36
2.4.1“while”循環(huán)36
2.4.2迭代數(shù)字 :區(qū)間和數(shù)列 37
2.4.3迭代 map 38
2.4.4使用“in”檢查集合和區(qū)間的成員39
2.5Kotlin 中的異常 41
2.5.1“try”“catch”和“finally” 41
2.5.2“try”作為表達(dá)式 42
2.6小結(jié)44
3 函數(shù)的定義與調(diào)用 45
3.1在 Kotlin 中創(chuàng)建集合 45
3.2讓函數(shù)更好調(diào)用 47
3.2.1命名參數(shù) 48
3.2.2默認(rèn)參數(shù)值49
3.2.3消除靜態(tài)工具類(lèi) :頂層函數(shù)和屬性 50
3.3給別人的類(lèi)添加方法 :擴(kuò)展函數(shù)和屬性53
3.3.1導(dǎo)入和擴(kuò)展函數(shù) 54
3.3.2從 Java 中調(diào)用擴(kuò)展函數(shù)54
3.3.3作為擴(kuò)展函數(shù)的工具函數(shù)55
3.3.4不可重寫(xiě)的擴(kuò)展函數(shù) 56
3.3.5擴(kuò)展屬性 58
3.4處理集合 :可變參數(shù)、中綴調(diào)用和庫(kù)的支持 59
3.4.1擴(kuò)展 Java 集合的 API 59
3.4.2可變參數(shù) :讓函數(shù)支持任意數(shù)量的參數(shù)60
3.4.3鍵值對(duì)的處理 :中綴調(diào)用和解構(gòu)聲明 60
3.5字符串和正則表達(dá)式的處理 62
3.5.1分割字符串62
3.5.2正則表達(dá)式和三重引號(hào)的字符串63
3.5.3多行三重引號(hào)的字符串 64
3.6讓你的代碼更整潔 :局部函數(shù)和擴(kuò)展 66
3.7小結(jié)68
4 類(lèi)、對(duì)象和接口 69
4.1定義類(lèi)繼承結(jié)構(gòu) 70
4.1.1Kotlin 中的接口 70
4.1.2open、final 和 abstract 修飾符 :默認(rèn)為 final72
4.1.3可見(jiàn)性修飾符 :默認(rèn)為 public 75
4.1.4內(nèi)部類(lèi)和嵌套類(lèi) :默認(rèn)是嵌套類(lèi)76
4.1.5密封類(lèi) :定義受限的類(lèi)繼承結(jié)構(gòu)79
4.2聲明一個(gè)帶非默認(rèn)構(gòu)造方法或?qū)傩缘念?lèi)80
4.2.1初始化類(lèi) :主構(gòu)造方法和初始化語(yǔ)句塊80
4.2.2構(gòu)造方法 :用不同的方式來(lái)初始化父類(lèi)83
4.2.3實(shí)現(xiàn)在接口中聲明的屬性85
4.2.4通過(guò) getter 或 setter 訪問(wèn)支持字段 87
4.2.5修改訪問(wèn)器的可見(jiàn)性 88
4.3編譯器生成的方法 :數(shù)據(jù)類(lèi)和類(lèi)委托 89
4.3.1通用對(duì)象方法 89
4.3.2數(shù)據(jù)類(lèi) :自動(dòng)生成通用方法的實(shí)現(xiàn) 92
4.3.3類(lèi)委托 :使用“by”關(guān)鍵字 93
4.4“object”關(guān)鍵字 :將聲明一個(gè)類(lèi)與創(chuàng)建一個(gè)實(shí)例結(jié)合起來(lái)95
4.4.1對(duì)象聲明 :創(chuàng)建單例易如反掌 95
4.4.2伴生對(duì)象 :工廠方法和靜態(tài)成員的地盤(pán)98
4.4.3作為普通對(duì)象使用的伴生對(duì)象 100
4.4.4對(duì)象表達(dá)式 :改變寫(xiě)法的匿名內(nèi)部類(lèi) 102
4.5小結(jié) 104
5 Lambda 編程 105
5.1Lambda 表達(dá)式和成員引用 105
5.1.1Lambda 簡(jiǎn)介 :作為函數(shù)參數(shù)的代碼塊106
5.1.2Lambda 和集合 107
5.1.3Lambda 表達(dá)式的語(yǔ)法 108
5.1.4在作用域中訪問(wèn)變量 111
5.1.5成員引用 114
5.2集合的函數(shù)式 API 116
5.2.1基礎(chǔ) :filter 和 map 116
5.2.2“all”“any”“count”和“find”: 對(duì)集合應(yīng)用判斷式 118
5.2.3groupBy :把列表轉(zhuǎn)換成分組的 map 119
5.2.4flatMap 和 flatten :處理嵌套集合中的元素120
5.3惰性集合操作 :序列121
5.3.1執(zhí)行序列操作 :中間和末端操作 123
5.3.2創(chuàng)建序列 125
5.4使用 Java 函數(shù)式接口 126
5.4.1把 lambda 當(dāng)作參數(shù)傳遞給 Java 方法127
5.4.2SAM 構(gòu)造方法 :顯式地把 lambda 轉(zhuǎn)換成函數(shù)式接口 129
5.5帶接收者的 lambda :“with”與“apply”131
5.5.1“with”函數(shù)131
5.5.2“apply”函數(shù) 133
5.6小結(jié) 135
6 Kotlin 的類(lèi)型系統(tǒng)137
6.1可空性137
6.1.1可空類(lèi)型 138
6.1.2類(lèi)型的含義 140
6.1.3安全調(diào)用運(yùn)算符 :“?:”141
6.1.4Elvis 運(yùn)算符 :“?:” 143
6.1.5安全轉(zhuǎn)換 :“as?” 145
6.1.6非空斷言 :“!!”146
6.1.7“let”函數(shù)148
6.1.8延遲初始化的屬性 149
6.1.9可空類(lèi)性的擴(kuò)展 151
6.1.10類(lèi)型參數(shù)的可空性 153
6.1.11可空性和 Java 153
6.2基本數(shù)據(jù)類(lèi)型和其他基本類(lèi)型 157
6.2.1基本數(shù)據(jù)類(lèi)型 :Int、Boolean 及其他158
6.2.2可空的基本數(shù)據(jù)類(lèi)型 :Int?、Boolean? 及其他159
6.2.3數(shù)字轉(zhuǎn)換 160
6.2.4“Any”和“Any?”:根類(lèi)型 162
6.2.5Unit 類(lèi)型 :Kotlin 的“void”163
6.2.6Nothing 類(lèi)型 :“這個(gè)函數(shù)永不返回” 164
6.3集合與數(shù)組 164
6.3.1可空性和集合165
6.3.2只讀集合與可變集合167
6.3.3Kotlin 集合和 Java 168
6.3.4作為平臺(tái)類(lèi)型的集合171
6.3.5對(duì)象和基本數(shù)據(jù)類(lèi)型的數(shù)組173
6.4小結(jié) 175
第 2 部分 擁抱 Kotlin 177
7 運(yùn)算符重載及其他約定179
7.1重載算術(shù)運(yùn)算符 180
7.1.1重載二元算術(shù)運(yùn)算 180
7.1.2重載復(fù)合賦值運(yùn)算符183
7.1.3重載一元運(yùn)算符 184
7.2重載比較運(yùn)算符 186
7.2.1等號(hào)運(yùn)算符 :“equals" 186
7.2.2排序運(yùn)算符 :compareTo187
7.3集合與區(qū)間的約定 188
7.3.1通過(guò)下標(biāo)來(lái)訪問(wèn)元素 :“get”和“set” 188
7.3.2“in”的約定190
7.3.3rangeTo 的約定 191
7.3.4在“for”循環(huán)中使用“iterator”的約定 192
7.4解構(gòu)聲明和組件函數(shù)193
7.4.1解構(gòu)聲明和循環(huán) 194
7.5重用屬性訪問(wèn)的邏輯 :委托屬性 195
7.5.1委托屬性的基本操作196
7.5.2使用委托屬性 :惰性初始化和“by lazy()”197
7.5.3實(shí)現(xiàn)委托屬性198
7.5.4委托屬性的變換規(guī)則202
7.5.5在 map 中保存屬性值 203
7.5.6框架中的委托屬性 204
7.6小結(jié) 205
8 高階函數(shù) :Lambda 作為形參和返回值 207
8.1聲明高階函數(shù)207
8.1.1函數(shù)類(lèi)型 208
8.1.2調(diào)用作為參數(shù)的函數(shù)209
8.1.3在 Java 中使用函數(shù)類(lèi) 211
8.1.4函數(shù)類(lèi)型的參數(shù)默認(rèn)值和 null 值 212
8.1.5返回函數(shù)的函數(shù) 214
8.1.6通過(guò) lambda 去除重復(fù)代碼 216
8.2內(nèi)聯(lián)函數(shù) :消除 lambda 帶來(lái)的運(yùn)行時(shí)開(kāi)銷(xiāo)218
8.2.1內(nèi)聯(lián)函數(shù)如何運(yùn)作 219
8.2.2內(nèi)聯(lián)函數(shù)的限制 221
8.2.3內(nèi)聯(lián)集合操作222
8.2.4決定何時(shí)將函數(shù)聲明成內(nèi)聯(lián)223
8.2.5使用內(nèi)聯(lián) lambda 管理資源 223
8.3高階函數(shù)中的控制流225
8.3.1lambda 中的返回語(yǔ)句 :從一個(gè)封閉的函數(shù)返回225
8.3.2從 lambda 返回 :使用標(biāo)簽返回226
8.3.3匿名函數(shù) :默認(rèn)使用局部返回 228
8.4小結(jié) 229
9 泛型 231
9.1泛型類(lèi)型參數(shù)232
9.1.1泛型函數(shù)和屬性 232
9.1.2聲明泛型類(lèi) 234
9.1.3類(lèi)型參數(shù)約束235
9.1.4讓類(lèi)型形參非空 237
9.2運(yùn)行時(shí)的泛型 :擦除和實(shí)化類(lèi)型參數(shù) 238
9.2.1運(yùn)行時(shí)的泛型 :類(lèi)型檢查和轉(zhuǎn)換 238
9.2.2聲明帶實(shí)化類(lèi)型參數(shù)的函數(shù)241
9.2.3使用實(shí)化類(lèi)型參數(shù)代替類(lèi)引用 243
9.2.4實(shí)化類(lèi)型參數(shù)的限制244
9.3變型 :泛型和子類(lèi)型化 245
9.3.1為什么存在變型 :給函數(shù)傳遞實(shí)參245
9.3.2類(lèi)、類(lèi)型和子類(lèi)型 246
9.3.3協(xié)變 :保留子類(lèi)型化關(guān)系 248
9.3.4逆變 :反轉(zhuǎn)子類(lèi)型化關(guān)系 252
9.3.5使用點(diǎn)變型 :在類(lèi)型出現(xiàn)的地方指定變型254
9.3.6星號(hào)投影 :使用 代替類(lèi)型參數(shù) 257
9.4小結(jié) 261
10 注解與反射 263
10.1聲明并應(yīng)用注解264
10.1.1應(yīng)用注解264
10.1.2注解目標(biāo)265
10.1.3使用注解定制 JSON 序列化 267
10.1.4聲明注解269
10.1.5元注解 :控制如何處理一個(gè)注解 270
10.1.6使用類(lèi)做注解參數(shù) 271
10.1.7使用泛型類(lèi)做注解參數(shù)272
10.2反射 :在運(yùn)行時(shí)對(duì) Kotlin 對(duì)象進(jìn)行自省 273
10.2.1Kotlin 反射 API :KClass、KCallable、KFunction 和KProperty 274
10.2.2用反射實(shí)現(xiàn)對(duì)象序列化278
10.2.3用注解定制序列化 279
10.2.4JSON 解析和對(duì)象反序列化283
10.2.5反序列化的一步 :callBy() 和使用反射創(chuàng)建對(duì)象 287
10.3小結(jié) 291
11 DSL 構(gòu)建 293
11.1從 API 到 DSL 293
11.1.1領(lǐng)域特定語(yǔ)言的概念 295
11.1.2內(nèi)部 DSL296
11.1.3DSL 的結(jié)構(gòu) 297
11.1.4使用內(nèi)部 DSL 構(gòu)建 HTML298
11.2構(gòu)建結(jié)構(gòu)化的 API:DSL 中帶接收者的 lambda 299
11.2.1帶接收者的 lambda 和擴(kuò)展函數(shù)類(lèi)型 299
11.2.2在 HTML 構(gòu)建器中使用帶接收者的 lambda 303
11.2.3Kotlin 構(gòu)建器 :促成抽象和重用307
11.3使用“invoke”約定構(gòu)建更靈活的代碼塊嵌套 310
11.3.1“invoke”約定 :像函數(shù)一樣可以調(diào)用的對(duì)象 310
11.3.2“invoke”約定和函數(shù)式類(lèi)型 311
11.3.3DSL 中的“invoke”約定 :在 Gradle 中聲明依賴 312
11.4實(shí)踐中的 Kotlin DSL 314
11.4.1把中綴調(diào)用鏈接起來(lái) :測(cè)試框架中的“should” 314
11.4.2在基本數(shù)據(jù)類(lèi)型上定義擴(kuò)展 :處理日期 316
11.4.3成員擴(kuò)展函數(shù) :為 SQL 設(shè)計(jì)的內(nèi)部 DSL317
11.4.4Anko :動(dòng)態(tài)創(chuàng)建 Android UI 320
11.5小結(jié) 322
A 構(gòu)建 Kotlin 項(xiàng)目 323
B Kotlin 代碼的文檔化 327
C Kotlin 生態(tài)系統(tǒng) 331
譯者序
當(dāng)收到這本書(shū)的翻譯邀請(qǐng)時(shí),我們的內(nèi)心是激動(dòng)的,終于有機(jī)會(huì)將自己喜愛(ài)的語(yǔ)言系統(tǒng)地介紹給中國(guó)的開(kāi)發(fā)者,而且是通過(guò)口碑頗佳的實(shí)戰(zhàn)系列。此時(shí),正值2017 年度的 Google I/O 召開(kāi)前夕,接下來(lái)重磅消息大家都知道了 :在 Google I/O 大會(huì)上,Kotlin 正式成為了官方的 Android 開(kāi)發(fā)語(yǔ)言,迅速占據(jù)了國(guó)內(nèi)各大技術(shù)媒體的頭條。一夜之間,所有的 Android 開(kāi)發(fā)者都迫切地想搞清楚它的來(lái)龍去脈。Kotlin究竟是何方神圣,為什么是它?
這一點(diǎn)兒也不奇怪。對(duì)于博學(xué) Android 開(kāi)發(fā)者來(lái)說(shuō),Kotlin 早已不是新鮮的概念了。早在 2015 年 1 月,Android 開(kāi)發(fā)者社區(qū)大神 Jake Wharton 就了一篇使用Kotlin 來(lái)進(jìn)行 Android 開(kāi)發(fā)的總結(jié)。那時(shí)開(kāi)始,不少頂尖的開(kāi)發(fā)者和公司就開(kāi)始嘗試在正式的 Android 項(xiàng)目中使用 Kotlin 語(yǔ)言 ;我們也從 2015 年開(kāi)始在多個(gè)項(xiàng)目上使用了 Kotlin 語(yǔ)言。它帶給我們的體驗(yàn),和帶給所有其他實(shí)踐過(guò) Kotlin 語(yǔ)言的開(kāi)發(fā)者的一樣 :它的發(fā)明者 JetBrains 所言非虛,這是一門(mén)簡(jiǎn)潔、安全、實(shí)用的語(yǔ)言,用了就停不下來(lái),就忍不住地想推薦給周?chē)娜恕N覀兝硭?dāng)然地把 Kotlin 放在了今年及時(shí)季度 ThoughtWorks 技術(shù)雷達(dá)的評(píng)估象限 :https://www.thoughtworks.com/radar/languages-and-frameworks/kotlin。
Kotlin 讓人愛(ài)不釋手的最重要原因就是來(lái)自 JetBrains 的基因。作為最負(fù)盛名的IDE 創(chuàng)造者,JetBrains 深諳開(kāi)發(fā)者的需求,孜孜不倦地追求給開(kāi)發(fā)者提供最實(shí)用、較高效的 IDE,包括 Android Studio、IntelliJ、RubyMine 等。由這樣想開(kāi)發(fā)者之所想的公司創(chuàng)造出來(lái)的語(yǔ)言,又怎么會(huì)不受開(kāi)發(fā)者熱捧呢?所以 Gradle、Spring,以及越來(lái)越多的庫(kù)、框架和工具也陸續(xù)加入到了支持 Kotlin 的陣營(yíng)。
本書(shū)深入淺出地介紹了 Kotlin 語(yǔ)言的方方面面,從最基礎(chǔ)的語(yǔ)言要素到如何定制自己的 DSL 都有涉及。相信讀者閱讀本書(shū)并嘗試之后一定會(huì)愛(ài)上這門(mén)語(yǔ)言,但把 Kotlin 應(yīng)用到自己的項(xiàng)目中會(huì)不會(huì)有什么風(fēng)險(xiǎn)呢?讀者們大可不必?fù)?dān)心,以往的經(jīng)驗(yàn)告訴我們,整個(gè)過(guò)程無(wú)縫無(wú)痛。首先,Kotlin 足夠簡(jiǎn)單,對(duì)于初學(xué)者來(lái)說(shuō)掌握也不算困難,兩三天就可以上手 ;其次,Kotlin 和 Java 可以無(wú)縫地銜接,可以在遺留項(xiàng)目上和 Java 混用 ;,編譯器的靜態(tài)檢查和 IDE(必須是 JetBrains 出品的 IntelliJ IDEA 或者 Android Studio)強(qiáng)大的輔助功能,可以幫你發(fā)現(xiàn)很多問(wèn)題(例如空指針異常)并將其自動(dòng)消除在搖籃之中。有的讀者會(huì)說(shuō),但我還沒(méi)有用過(guò)這些IDE 啊?那你還在猶豫什么,請(qǐng)立即使用它們來(lái)提高你的生產(chǎn)力吧!這也算是使用Kotlin 帶來(lái)的額外收獲。
從 Kotlin 成為 Android 開(kāi)發(fā)語(yǔ)言的那一刻開(kāi)始,我們熱情高漲地投入了幾乎全部業(yè)余時(shí)間到本書(shū)的翻譯工作,終于在最短的時(shí)間內(nèi)把它呈現(xiàn)在廣大讀者面前。這一切還要感謝本書(shū)的編輯和所有譯者家人在背后的默默付出。由于譯者水平所限,難免出現(xiàn)謬誤遺漏,還望讀者海涵斧正。
覃宇、羅麗、李思陽(yáng)、蔣揚(yáng)海
2017 年 6 月于 ThoughtWorks 成都
序
當(dāng)我在 2010 年春季及時(shí)次拜訪 JetBrains 的時(shí)候,我相當(dāng)確定世界上不需要另一種通用編程語(yǔ)言了。我認(rèn)為現(xiàn)有的 JVM 上的語(yǔ)言已經(jīng)足夠好了,誰(shuí)會(huì)有想法去創(chuàng)建一門(mén)新語(yǔ)言呢?在經(jīng)過(guò)大約一個(gè)小時(shí)的關(guān)于大規(guī)模代碼庫(kù)上產(chǎn)品問(wèn)題的討論后我被說(shuō)服了,并且后來(lái)成為 Kotlin 一部分的最初想法就已經(jīng)被描繪在白板上。很快我就加入了 JetBrains 來(lái)主導(dǎo)這門(mén)語(yǔ)言的設(shè)計(jì)與編譯器的開(kāi)發(fā)工作。
到今天,六年多的時(shí)光過(guò)去了,我們也快要第二個(gè)版本。我們已經(jīng)擁有超過(guò) 30 人的團(tuán)隊(duì)和數(shù)以千計(jì)的活躍用戶,還有很多讓我們難以輕易實(shí)現(xiàn)的精彩的設(shè)計(jì)理念。但是不要擔(dān)心,這些想法在進(jìn)入這門(mén)語(yǔ)言之前還必須經(jīng)過(guò)縝密的考察。我們希望這本書(shū)的篇幅依然能夠容得下 Kotlin 的未來(lái)。
學(xué)習(xí)一門(mén)編程語(yǔ)言是一個(gè)令人興奮而且常常是回報(bào)頗豐的嘗試。如果它是你的及時(shí)門(mén)語(yǔ)言,通過(guò)它你能學(xué)到整個(gè)編程的新世界。如果不是,它會(huì)使你以新的術(shù)語(yǔ)來(lái)思考熟悉的東西,從而以更高層次的抽象來(lái)更深入地了解它們。本書(shū)主要針對(duì)后者,即面向已經(jīng)熟悉 Java 的讀者。
從頭開(kāi)始設(shè)計(jì)一門(mén)語(yǔ)言可能是一項(xiàng)具有挑戰(zhàn)性的任務(wù),但是使其與另一門(mén)語(yǔ)言融洽的工作就是另一回事了——尤其是那門(mén)語(yǔ)言還包含了許多的憤怒的食人魔,以及一些陰暗的地牢(在這一點(diǎn)上你如果不相信可以去問(wèn) C 的創(chuàng)造者 Bjarne Stroustrup)。與 Java 的互操作性(這就是 Java 與 Kotlin 之間是如何互相混合調(diào)用的)是 Kotlin 的基石之一,本書(shū)也投入了很多的注意力在這一點(diǎn)上。互操作性對(duì)于在一個(gè)已有的 Java 代碼庫(kù)中逐步地引入 Kotlin 非常重要。即使從頭開(kāi)始開(kāi)發(fā)一個(gè)新項(xiàng)目時(shí),也必須考慮到能夠?qū)⑦@門(mén)語(yǔ)言融入一個(gè)擁有更大圖景的平臺(tái)中去,而以 Java 編寫(xiě)的所有函數(shù)庫(kù)就是這樣的一個(gè)平臺(tái)。
當(dāng)我在編寫(xiě)本書(shū)時(shí),兩個(gè)新的目標(biāo)平臺(tái)正在開(kāi)發(fā) :Kotlin 現(xiàn)在可以在 JavaScript虛擬機(jī)上運(yùn)行以支持全棧 web 開(kāi)發(fā),并且還將很快能夠直接編譯成原生代碼,從而在需要的時(shí)候能夠脫離任何的虛擬機(jī)來(lái)運(yùn)行。 1 所以,雖然本書(shū)是面向 JVM 的,但是你從中學(xué)到的很多東西也是可以應(yīng)用于其他運(yùn)行環(huán)境的。
本書(shū)作者從項(xiàng)目伊始就已經(jīng)是 Kotlin 團(tuán)隊(duì)的成員,所以他們對(duì)語(yǔ)言本身和內(nèi)部實(shí)現(xiàn)非常熟悉。他們?cè)跁?huì)議演講、研討會(huì)及 Kotlin 課程方面的經(jīng)驗(yàn)使他們能夠?qū)︻A(yù)期的常見(jiàn)問(wèn)題及可能的陷阱,提供良好的闡述。本書(shū)既闡釋了語(yǔ)言特征背后的高級(jí)概念,也提供了足夠深入的細(xì)節(jié)。
希望你能享受與我們的語(yǔ)言及本書(shū)相處的時(shí)光。正如我經(jīng)常在我們社區(qū)的帖子中說(shuō)的那樣 :使用 Kotlin 愉快!
ANDREY BRESLAV,JetBrains Kotlin 首席設(shè)計(jì)師
開(kāi)發(fā)者想完成他們的工作——同時(shí)越省事越好。使用 Kotlin 編碼就意味著省事。Kotlin 編程語(yǔ)言提供了賦有表現(xiàn)力的語(yǔ)法,強(qiáng)大直觀的類(lèi)型系統(tǒng)和美妙的工具支持,還有與現(xiàn)存 Java 代碼、庫(kù)及框架無(wú)縫的互操作性。Kotlin 可以被編譯成 Java 字節(jié)碼,所以你可以在所有使用 Java 的地方使用它,包括 Android 在內(nèi)。借助高效的編譯器和標(biāo)準(zhǔn)庫(kù),Kotlin 在運(yùn)行時(shí)幾乎不用承受任何額外開(kāi)銷(xiāo)。
——kotlin核心開(kāi)發(fā)者
“既闡釋了高級(jí)概念,也提供了足夠深入的細(xì)節(jié)。”
— 摘自 Kotlin 首席設(shè)計(jì)師 Andrey Breslav 作的序
“這本書(shū)保持了 Manning 實(shí)戰(zhàn)系列的水準(zhǔn),滿足了你快速提高生成力的所有需要。”
— Kevin Orr, Sumus Solutions
“有這本書(shū)指導(dǎo)你,Kotlin 學(xué)起來(lái)有趣又簡(jiǎn)單!”
— Filip Pravica, Info.nl
“寫(xiě)得非常,非常好,淺顯易懂。”
— Jason Lee, NetSuite
這書(shū)可以,好好學(xué)習(xí)
我很喜歡新事物
好書(shū),印刷清晰內(nèi)容強(qiáng)!我喜歡
紙張還行 主要是送貨快
非常好,入門(mén)kotlin就靠它了,很棒
不錯(cuò)正品 值得買(mǎi),包裝也挺好的,這個(gè)價(jià)錢(qián)值了
已經(jīng)開(kāi)始看了,加油。
很好,學(xué)習(xí)無(wú)止境,程序猿!
書(shū)還不錯(cuò)。
很有幫助,學(xué)到了很多
書(shū)就不多說(shuō)了,當(dāng)當(dāng)也是專門(mén)賣(mài)書(shū)的電商,每次在當(dāng)當(dāng)賣(mài)書(shū)都是一個(gè)塑料袋套書(shū)。運(yùn)輸過(guò)程中各種暴力。主皮被不明尖物體扎了兩個(gè)眼,另一本書(shū)角明顯是被暴力仍后落地,書(shū)角都仍嘿了。包裝差評(píng)差評(píng)差評(píng)
新技術(shù),趕緊買(mǎi)一本看看
很好!快遞員也很好,速度很快
經(jīng)典之作,學(xué)習(xí)Kotlin的好書(shū)
不錯(cuò),沒(méi)破損
幫朋友買(mǎi)的,用來(lái)自學(xué)。
這本書(shū)還不錯(cuò)
常閱可修身養(yǎng)性可陶冶性情可勵(lì)志也是我們洞察世界的途徑現(xiàn)實(shí)一點(diǎn)說(shuō)就是古人說(shuō)的
111111
還沒(méi)看,中文版就這一本,先買(mǎi)著有時(shí)間學(xué)習(xí)一下