認(rèn)真學(xué)習(xí) Kotlin 的細(xì)節(jié)后,你就可以使用這門受歡迎的語言構(gòu)建 Android 應(yīng)用、Web 應(yīng)用以及其他程序。通過學(xué)習(xí)本書,開發(fā)者們將學(xué)習(xí)到如何在自己的項(xiàng)目中使用這門基于Java的語言。無論你是經(jīng)驗(yàn)豐富的編程人員還是學(xué)習(xí) Kotlin 的新人,都將獲益良多。
作者 Ken Kousen(也是Modern Java Recipes一書的作者)將教授你如何專注于使用自己的 Kotlin 方案來解決問題而不是陷于基礎(chǔ)語法之中。針對常見問題,本書將給出具體解決方案。Kotlin 在 Android 開發(fā)上已經(jīng)大規(guī)模使用,但實(shí)際上 Kotlin 不僅可以用于任何應(yīng)用 Java 的地方,還可以用于 iOS 開發(fā)、編寫原生應(yīng)用程序、JavaScript 開發(fā)以及更多場景。立即投入 Kotlin 的學(xué)習(xí)并開始創(chuàng)建新項(xiàng)目吧!
通過本書,你將:
●掌握函數(shù)式編程概念,包括 lambda 表達(dá)式、序列和并發(fā)。
●學(xué)習(xí)如何使用委托、延遲初始化和作用域函數(shù)。
●學(xué)習(xí) Kotlin 與 Java 互操作的能力并使用 Kotlin 訪問 Java 庫。
● 能夠編寫擴(kuò)展函數(shù)。
● 能夠使用諸如 JUnit5 之類的實(shí)用庫。
● 在特定的開發(fā)框架(例如 Android 和 Spring)內(nèi)獲得實(shí)踐經(jīng)驗(yàn)。
已掌握Kotlin基礎(chǔ)知識的讀者推薦閱讀:《深入理解Kotlin協(xié)程》,點(diǎn)擊購買。
適讀人群 :本書從安裝并運(yùn)行Kotlin講起,是一本入門級讀物,適合有一定編程經(jīng)驗(yàn)的開發(fā)人員,想要零基礎(chǔ)入門Kotlin閱讀。 本書的重點(diǎn)不僅在于講解 Kotlin 的語法與語義,還將展示何時(shí)以及為何應(yīng)該使用某個(gè)指定的語言特性。
本書的目標(biāo)不一定會涵蓋每一個(gè) Kotlin 語法與庫的細(xì)節(jié)。
但在最后,本書添加了很多基本原理的內(nèi)容,讓即使只有 Kotlin 初級知識的讀者也可以理解本書的內(nèi)容。
當(dāng)你認(rèn)真學(xué)習(xí) Kotlin 的細(xì)節(jié)后,你就可以使用這門受歡迎的語言構(gòu)建 Android 應(yīng)用、Web 應(yīng)用以及其他程序。
Kotlin 不僅可以用于任何應(yīng)用 Java 的地方,還可以用于 iOS 開發(fā)、編寫原生應(yīng)用程序、JavaScript 開發(fā)以及更多場景。
歡迎來到Kotlin的世界!本書的重點(diǎn)不僅在于講解Kotlin的語法與語義,還將向你展示何時(shí)以及為何應(yīng)該使用某個(gè)特定的語言特性。本書不會涵蓋每一個(gè)Kotlin語法與庫的細(xì)節(jié),但在最后添加了很多基本原理的“食譜”,讓即使只有Kotlin初級知識的讀者也可以理解本書的內(nèi)容。
JetBrains大力鼓勵(lì)Kotlin社區(qū)擁抱多平臺(Multiplatform)、原生(Native)以及JavaScript開發(fā)的發(fā)展。由于它們還處于測試階段且使用率很低,所以最后還是決定不在本書中介紹它們。因此,本書只專注于運(yùn)行在JVM上的Kotlin。
存放本書所有相關(guān)代碼的Github倉庫位于https://github.com/kousen/kotlin-cookbook。它包含一個(gè)Gradle包裝器(當(dāng)然,構(gòu)建文件是用Kotlin DSL編寫的)并且通過了所有的測試。
本書中所有的代碼示例均已通過兩種長期支持的可用Java版本進(jìn)行了編譯與測試,即Java 8與Java 11。盡管Java 8在技術(shù)上已超過其生命周期的最后期限,但它在業(yè)界依然被普遍使用,代碼示例確保可以在其上運(yùn)行。在本書寫作過程中,Kotlin的版本是1.3.50,而當(dāng)前版本則是1.3.60譯注1。所有的代碼都可以在這兩個(gè)版本上運(yùn)行,并且Github倉庫將經(jīng)常更新以使用最新版的Kotlin。
【本書目標(biāo)讀者】
本書面向已經(jīng)了解面向?qū)ο缶幊袒A(chǔ)的開發(fā)者,特別是了解Java以及其他基于JVM的語言的讀者。擁有Java知識將會有所幫助,但這不是必需的。
本書更側(cè)重于Kotlin的使用技巧與習(xí)慣用法,而不是成為這門語言的詳盡資源。其優(yōu)點(diǎn)在于在任何給定的示例中可以發(fā)揮這門語言的所有潛力,但缺點(diǎn)在于對這些特性的基礎(chǔ)部分介紹有限。本書每一章都包含了該章相關(guān)基礎(chǔ)技術(shù)的簡介,所以如果你只是模糊地知道如何創(chuàng)建集合、使用數(shù)組,或設(shè)計(jì)類,那么已經(jīng)相當(dāng)不錯(cuò)了。在線參考手冊(https://kotlinlang.org/docs/reference)對Kotlin進(jìn)行了詳盡的介紹,所以本書經(jīng)常引用其中的示例與討論。
此外本書還經(jīng)常介紹Kotlin庫函數(shù)的實(shí)現(xiàn)。這是為了展示這門語言的開發(fā)者如何在實(shí)踐中使用它們,并討論這些函數(shù)的設(shè)計(jì)方式。如果你很著急,無須預(yù)先了解實(shí)現(xiàn),可以跳過這些細(xì)節(jié)。
【本書主要內(nèi)容】
本書分為13章,每一章都是獨(dú)立的,但本書引用了許多其他資料。你可以按任意喜歡的順序閱讀本書。
第①章講解了安裝并運(yùn)行Kotlin的基本過程,包括使用REPL,使用諸如Maven以及Gradle等構(gòu)建工具,以及在Graal中使用原生鏡像生成器。
第2章講解了Kotlin的基本特性—例如可空類型、操作符重載以及類型轉(zhuǎn)換,然后介紹了一些更深奧的問題,包括按位移位操作符或者在Pair類上編寫擴(kuò)展函數(shù)等。
第3章重點(diǎn)介紹了Kotlin的面向?qū)ο筇匦,而該部分?nèi)容可能會讓其他語言的開發(fā)者對此感到驚訝或不明所以。它包含如何使用const關(guān)鍵字、Kotlin如何處理幕后屬性、延遲初始化以及令人恐懼的Nothing類,這些內(nèi)容一定會令現(xiàn)有的Java開發(fā)者感到困惑。
第4章只有很少的一部分內(nèi)容,其中涵蓋一些需要被解釋說明的函數(shù)式特性。函數(shù)式編程概念會始終貫穿全書,特別是當(dāng)我們談?wù)摷稀⑿蛄幸约皡f(xié)程時(shí),但該章中包含的一些有用的技巧可能會讓你感覺到不同尋;蚍浅S腥。
第5章介紹了數(shù)組與集合,主要介紹一些不那么為人所知的方法,例如集合解構(gòu)、按多個(gè)屬性排序、在集合上構(gòu)建窗口,以及創(chuàng)建數(shù)列。
第6章展示了Kotlin如何惰性處理序列中的元素,類似于在Java中使用流的方式,內(nèi)容包含生成序列、在序列中生產(chǎn)元素以及使用無限序列。
第7章涵蓋了Kotlin獨(dú)有的另一個(gè)主題:在對象的上下文中執(zhí)行代碼塊的函數(shù)。諸如let、apply以及also這類函數(shù)在Kotlin中非常有用,該章會說明為什么以及如何使用它們。
第8章討論了Kotlin中的一個(gè)便捷特性:如何實(shí)現(xiàn)委托。委托可以讓你使用組合而不是繼承,Kotlin的標(biāo)準(zhǔn)庫包含了一系列的委托,例如lazy、observable以及vetoable。
第9章涵蓋了有關(guān)測試的重要主題,將會重點(diǎn)關(guān)注JUnit5。在當(dāng)前版本下,JUnit已經(jīng)被設(shè)計(jì)為可以與Kotlin良好地配合使用,其中包括常規(guī)用法以及在Spring框架應(yīng)用程序中使用。該章會討論使編寫與執(zhí)行測試更加容易的幾種方式。
第10章涵蓋了一些專門用于資源管理的方法,包括文件I/O,以及在多種情況下具有廣泛適用性的use函數(shù)。
第11章介紹了其他類別的書中不容易找到的主題。諸如如何獲取當(dāng)前Kotlin版本,如何強(qiáng)制when語句在即使沒有返回值的時(shí)候也要覆蓋所有情況,以及如何在正則表達(dá)式中使用replace函數(shù)。此外,也討論了TODO函數(shù)和Random類,以及如何與Java異常處理集成。
第12章涉及對Kotlin非常友好的Spring框架與Spring Boot,少量內(nèi)容展示了如何將Kotlin類作為托管的bean、如何實(shí)現(xiàn)JPA持久性,以及如何在需要的時(shí)候進(jìn)行依賴注入。
第13章介紹協(xié)程。協(xié)程是Kotlin中最受歡迎的功能之一,也是這門語言并發(fā)與并行編程的基礎(chǔ),內(nèi)容包含基礎(chǔ)知識,例如構(gòu)建器與調(diào)度器、如何取消與調(diào)試協(xié)程,以及如何在自定義的Java線程池中運(yùn)行它們。
這13章的內(nèi)容不需要按特定順序閱讀。它們相輔相成,你可以從任何地方開始閱讀。章節(jié)分組提供了一種將相似內(nèi)容放在一起的方式,但是我們還是希望你可以在各章節(jié)之間自由跳躍從而解決你當(dāng)前可能遇到的任何問題。
【給Android開發(fā)者的特別建議】
Kotlin目前是Android開發(fā)的首選語言,但它是一種更廣泛的通用語言。你可以在任何原先使用Java的地方以及其他更多場景中使用它。本書沒有專門針對Android的章節(jié),相反,將全面討論Kotlin在Android中的應(yīng)用。一些與Android有關(guān)的特定內(nèi)容(例如協(xié)程的取消),利用了Android庫廣泛使用Kotlin的事實(shí),但一般來說,本書涵蓋的語言特性可以在任何地方使用。本書希望以一種更通用的方式覆蓋這門語言,使Android開發(fā)者能學(xué)到在開發(fā)任何項(xiàng)目時(shí)都有用的技巧。
◆推薦序 ◆
序言
每隔幾年,就會出現(xiàn)一種革命性的新語言,它們常常揚(yáng)言要改變?nèi)藗兙帉戃浖姆绞健5F(xiàn)實(shí)卻常常辜負(fù)它們。而Kotlin則與它們有所不同。將時(shí)光回退到2011年,Kotlin開始緩慢地、幾乎不可察覺地悄悄進(jìn)入世界各地的代碼庫。那些長期使用Java并且發(fā)現(xiàn)了它的缺點(diǎn)的人們開始到處學(xué)習(xí)Kotlin。正因如此,他們縮短了代碼的長度卻增強(qiáng)了代碼的功能。
Kotlin作為Android開發(fā)的首選語言而聞名,而如今Kotlin已經(jīng)足夠成熟,所以迫切需要一本像本書這樣的書。本書從頭開始講解了許多有用的技巧。作者將向你展示如何安裝Kotlin以及為你的項(xiàng)目配置它。他也會向你展示如何在Java環(huán)境、瀏覽器中或作為一個(gè)獨(dú)立的應(yīng)用程序來運(yùn)行Kotlin。但本書會快速推進(jìn)內(nèi)容,解決世界各地的開發(fā)者與架構(gòu)師所面臨的日常編程問題。
盡管有一小節(jié)是專門講解Kotlin測試的,但你會發(fā)現(xiàn)本書本身就是測試驅(qū)動的。它將測試作為如何使用這門語言的實(shí)際示例。通過測試,你可以更精確地調(diào)整方案以適應(yīng)你的需求。
本書將帶給你直接而實(shí)用的幫助,可以指導(dǎo)你在Kotlin旅途中快速進(jìn)步。本書是Kotlin必不可少的操作指南,每個(gè)開發(fā)者都應(yīng)將其保存在桌面(真實(shí)或虛擬)上,以支持日常工作。
Dawn Griffiths與David Griffiths
Head First Kotlin的作者
2019年10月6日
【作者簡介】
Ken Kousen是Java Champion、Oracle Groundbreaker Ambassador與JavaOne Rock Star三個(gè)獎項(xiàng)的獲得者。Ken在他自己的公司 Kousen IT開發(fā)軟件并教授軟件開發(fā)課程。同時(shí)也是JetBrains官方認(rèn)證的Kotlin培訓(xùn)合作伙伴。
【譯者簡介】
喬禹昂,攜程機(jī)票移動端高級工程師,長期在工作中將 Kotlin 用于實(shí)踐,Kotlin界的優(yōu)秀“后浪”。Kotlin 中文社區(qū)成員,官方文檔譯者。主要負(fù)責(zé)翻譯協(xié)程、Native 部分的多篇官方文檔,曾擔(dān)任北京 GDG/Kotlin Everywhere 大會講師,分享了《Kotlin 函數(shù)式編程》的主題。對 Kotlin Native、Kotlin Multiplaform 等實(shí)驗(yàn)性新技術(shù)也頗有研究。
●第1章 安裝并運(yùn)行Kotlin 11
1.1 在沒有本地編譯器的情況下運(yùn)行Kotlin 11
1.2 在本地安裝Kotlin 13
1.3 在命令行中編譯并運(yùn)行Kotlin 15
1.4 使用Kotlin REPL 16
1.5 執(zhí)行Kotlin腳本 17
1.6 使用GraalVM構(gòu)建獨(dú)立應(yīng)用程序 18
1.7 為Gradle添加Kotlin插件(Groovy語法) 21
1.8 為Gradle添加Kotlin插件(Kotlin語法) 24
1.9 使用Gradle構(gòu)建Kotlin工程 26
1.10 使用Maven編譯Kotlin 27
●第2章 Kotlin基礎(chǔ) 31
2.1 在Kotlin中使用可空類型 31
2.2 在Java中添加可空指示器 34
2.3 為Java添加重載方法 36
2.4 顯式類型轉(zhuǎn)換 40
2.5 打印不同的進(jìn)制 42
2.6 數(shù)冪 44
2.7 使用移位運(yùn)算符 46
2.8 使用位布爾運(yùn)算符 49
2.9 使用to函數(shù)創(chuàng)建Pair實(shí)例 52
●第3章 Kotlin中的面向?qū)ο缶幊? 55
3.1 理解const與val的不同之處 55
3.2 創(chuàng)建自定義的getter與setter 56
3.3 定義數(shù)據(jù)類 59
3.4 幕后屬性技術(shù) 62
3.5 操作符重載 65
3.6 使用lateinit進(jìn)行延遲初始化 67
3.7 使用安全轉(zhuǎn)換函數(shù)、恒等操作符,以及Elvis操作符覆蓋equals函數(shù) 70
3.8 創(chuàng)建單例 72
3.9 無事生非 75
●第4章 函數(shù)式編程 79
4.1 在算法中使用fold 79
4.2 使用reduce函數(shù)進(jìn)行歸約 82
4.3 使用尾遞歸 84
●第5章 集合 89
5.1 使用數(shù)組 89
5.2 創(chuàng)建集合 92
5.3 為已存在的集合創(chuàng)建只讀視圖 94
5.4 從集合構(gòu)建map 96
5.5 當(dāng)集合為空的時(shí)候返回默認(rèn)值 97
5.6 將變量限制在給定區(qū)間 98
5.7 處理集合中的窗口 100
5.8 解構(gòu)list 102
5.9 將多個(gè)屬性排序 103
5.10 自定義迭代器 105
5.11 根據(jù)類型過濾集合 107
5.12 在數(shù)列中創(chuàng)建區(qū)間 108
●第6章 序列 113
6.1 使用懶序列 113
6.2 生成序列 115
6.3 管理無限序列 117
6.4 以固定間隔從序列生成元素 119
●第7章 作用域函數(shù) 123
7.1 使用apply函數(shù)在構(gòu)造結(jié)束之后初始化對象 123
7.2 使用also函數(shù)進(jìn)行其他操作 124
7.3 使用let函數(shù)與Elvis 126
7.4 使用let函數(shù)代替臨時(shí)變量 128
●第8章 Kotlin委托 131
8.1 使用委托實(shí)現(xiàn)組合 131
8.2 使用lazy委托 134
8.3 確保值不為空 136
8.4 使用observable與vetoable委托 137
8.5 使用映射作為委托 141
8.6 創(chuàng)建你自己的委托 143
●第9章 測試 147
9.1 設(shè)置測試類的生命周期 147
9.2 使用數(shù)據(jù)類進(jìn)行測試 152
9.3 使用幫助函數(shù)并使用默認(rèn)參數(shù) 154
9.4 使用不同的參數(shù)重復(fù)JUnit 5的測試 156
9.5 使用數(shù)據(jù)類進(jìn)行參數(shù)化測試 159
●第10章 輸入/輸出 161
10.1 使用use函數(shù)管理資源 161
10.2 寫文件 164
●第11章 其他
11.1 在代碼中獲取Kotlin版本號
11.2 重復(fù)執(zhí)行l(wèi)ambda表達(dá)式
11.3 強(qiáng)制when語句進(jìn)行窮舉
11.4 在正則表達(dá)式中使用replace函數(shù)
11.5 轉(zhuǎn)換為二進(jìn)制字符串并返回
11.6 使一個(gè)類可執(zhí)行
11.7 測量經(jīng)過時(shí)間
11.8 啟動線程
11.9 使用TODO強(qiáng)制完成
11.10 理解Random的隨機(jī)行為
11.11 在函數(shù)命名中使用特殊字符
11.12 告知Java處理異常
●第12章 Spring框架
12.1 開放用于繼承的Spring管理的bean類
12.2 持久化Kotlin數(shù)據(jù)類
12.3 依賴注入
●第13章 協(xié)程與結(jié)構(gòu)化并發(fā)
13.1 選擇協(xié)程構(gòu)建器
13.2 使用withContext替換async/await
13.3 使用協(xié)程調(diào)度器
13.4 在Java線程池上運(yùn)行協(xié)程
13.5 取消協(xié)程
13.6 協(xié)程調(diào)試