Kotlin入門簡介
Kotlin的“簡歷”
- 來自於著名的IDE IntelliJ IDEA(Android Studio基於此開發) 軟件開發公司 JetBrains(位於東歐捷克)
- 起源來自JetBrains的聖彼得堡團隊,名稱取自聖彼得堡附近的一個小島(Kotlin Island)
- 一種基於JVM的靜態類型編程語言
語法簡單,不啰嗦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
|
- Kotlin支持類型推斷,沒有Java那樣的啰嗦。
- 另外用
var
表示變量,val
表示常量更加的簡潔 - 方法也很簡單,連function都縮寫成了fun,平添了幾分雙關之意。
- 類的繼承和實現很簡單,使用:即可
- Kotlin每個句子都不需要加分號(;)
空指針安全
空指針(NullPointerException或NPE)是我們使用Java開發程序中最常見的崩潰了。因為在Java中我們不得不寫很多防禦性的代碼,比如這樣
1
2
3
4
5
6
7
8
|
|
在Kotlin中空指針異常得到了很好的解決。
- 在類型上的處理,即在類型後面加上?,即表示這個變量或參數以及返回值可以為null,否則不允許為變量參數賦值為null或者返回null
- 對於一個可能是null的變量或者參數,在調用對象方法或者屬性之前,需要加上?,否則編譯無法通過。
如下面的代碼就是Kotlin實現空指針安全的一個例子,而且相對Java實現而言,簡直是一行代碼搞定的。
1
2
3
4
5
6
7
8
9
10
11
12
|
|
關於空指針安全的原理,可以參考這篇文章研究學習Kotlin的一些方法
支持方法擴展
很多時候,Framework提供給我們的API往往都時比較原子的,調用時需要我們進行組合處理,因為就會產生了一些Util類,一個簡單的例子,我們想要更快捷的展示Toast信息,在Java中我們可以這樣做。
1
2
3
|
|
但是Kotlin的實現卻讓人驚奇,我們只需要重寫擴展方法就可以了,比如這個longToast方法擴展到所有的Context對象中,如果不去追根溯源,可能無法區分是Framework提供的還是自行擴展的。
1
2
3
4
|
|
註意:Kotlin的方法擴展並不是真正修改了對應的類文件,而是在編譯器和IDE方面做得處理。使我們看起來像是擴展了方法。
Lambda, 高階函數,Streams API, 函數式編程支持
所謂的Lambda表達式是匿名函數,這使得我們的代碼會更加的簡單。比如下面的代碼就是lambda的應用。
1
2
3
|
|
所謂的高階函數就是
- 可以接受函數作為參數
- 也可以返回函數作為結果
舉一個接受函數作為參數的例子。在Android開發中,我們經常使用SharedPreference來存儲數據,如果忘記調用apply或者commit則數據修改不能應用。利用Kotlin中的高階函數的功能,我們能更好的解決這個問題
1
2
3
4
5
6
7
8
9
10
|
|
當然這上面的例子中我們也同時使用了方法擴展這個特性。
Kotlin支持了Streams API和方法引用,這樣函數式編程更加方便。比如下面的代碼就是我們結合Jsoup,來抓取某個proxy網站的數據,代碼更加簡單,實現起來也快速。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
|
字符串模板
無論是Java還是Android開發,我們都會用到字符串拼接,比如進行日誌輸出等等。在Kotlin中,字符串模板是支持的,我們可以很輕松的完成一個字符串數組的組成
1
2
3
|
|
註意:關於字符串拼接可以參考這篇文章Java細節:字符串的拼接
與Java交互性好
Kotlin和Java都屬於基於JVM的編程語言。Kotlin和Java的交互性很好,可以說是無縫連接。這表現在
- Kotlin可以自由的引用Java的代碼,反之亦然。
- Kotlin可以現有的全部的Java框架和庫
- Java文件可以很輕松的借助IntelliJ的插件轉成kotlin
Kotlin應用廣泛
Kotlin對Android應用開發支持廣泛,諸多工具,比如kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,當然還有已經存在的很多Java的庫都是可以使用的。
除此之外,Kotlin也可以編譯成Javascript。最近使用Kotlin寫了一段抓取proxy的代碼,實現起來非常快捷。甚至比純JavaScript實現起來要快很多。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
|
關於性能
Kotlin的執行效率和Java代碼的執行效率理論上一致的。有時候Kotlin可能會顯得高一些,比如Kotlin提供了方法的inline設置,可以設置某些高頻方法進行inline操作,減少了運行時的進棧出棧和保存狀態的開銷。
Kotlin的魅力究竟在哪裏
Kotlin的有很多特點,比如簡潔,安全實用,開發效率高和提升可讀性,更好的函數式編程支持。
1.簡潔,Kotlin的代碼確實比Java更加簡潔,比如類型推斷,省去結尾的分號等等,然而這遠不能成為我們改用Kotlin的原因。
2.安全,這是Kotlin的一個很重要的特性。Kotlin是空指針安全的,JetBrains做了一件很聰明的事情,它們將運行時才能空指針的檢測提前到了編譯時,主要方式是增加了Any?這種可為空的類型,使用Kotlin之後,我們程序的空指針會得到明顯的改善。
3.實用,高效率。Kotlin的實用具體表現在
- 引入Object,便於我們更好的應用單例模式
- 引入data class, 避免了我們手寫getter/setter/toString等方法
- 引入參數默認值和具名參數,避免了不必要的方法重載
- 支持擴展方法,讓我們可以省去好多必須要的代碼
4.Kotlin引入了Lambda,Streams API 和函數式編程支持。
- Lambda表達式可以省去了我們創建很多匿名內部類的代碼(註由於目前Kotlin基於JVM6,Lambda表達式在字節碼階段依然會翻譯成內部類形式)
- Streams API 結合Lambda表達式和方法引用,讓我們的代碼處理一件事情以描述的形式,而不是命令實現的方式。
- Kotlin支持OOP(面向對象編程)和FP(函數式編程),語言本身並沒有限制,給了我們選擇的自由,Kotlin對FP的友好支持,便於我們寫出更加穩定,易於測試,無副作用的方法和代碼
5.可讀性 從客觀上,Kotlin語法和特性上讓代碼更加具有描述性而已。但是不得不指出代碼可讀性主要依賴編寫者的編碼素質和能力。
對我個人而言,高階函數和方法擴展這兩個特點著實真心受用。方法擴展會讓我有一種創造感,這是Java種的Util方法所無法比擬的。
有了Google的支持,Kotlin轉Android相信在不久的將來就會全面展開。篡改Python的一句名言“人生苦短,我用Kotlin”,這樣一個高效實用的語言應該會被越來越多的團隊所接受,並應用到開發生產中。當然也希望在國內環境下大放異彩。
refs:
http://droidyue.com/blog/2017/05/18/why-do-i-turn-to-kotlin/
http://droidyue.com/blog/2017/05/21/my-opinion-of-kotlins-becoming-an-official-language-of-android/
Kotlin入門簡介