從Android 7.0開始,谷歌使用的API從Oracle JDK切換到了open JDK,這對於谷歌來講是一個艱難的決定。對於開發者來講,卻倍感興奮,這意味着長期的官司問題也許就此結束,Android系統開發又能夠迴歸到一個正常的軌道,持續給全球的安卓用戶帶來驚喜。html
Kotlin語言有什麼優點?linux
Kotlin語言被讚譽爲Android世界裏的Swift.程序員
簡單來講,能夠這樣歸納:編程
使用Kotlin對Android開發者意味着什麼?閉包
使用Kotlin開發,對於安卓開發來講,主要有下面幾個有利的影響:框架
What is Kotlin函數
Kotlin語言是由JetBrains公司開發,其初衷用於快速生成JavaScript代碼,而現在Kotlin已經支持Android開發,並提供了一系列的Android開發插件。因爲JetBrains的自然優點(Android Studio就是在JetBrains公司開發的IDE上面添加了一些插件而成),Android Studio對Kotlin語言的支持也比較到位。
看一看Kotlin語言給咱們帶來了什麼。工具
Null Safe開發工具
空指針異常的確是困擾Java程序員不少年的問題,Swift語言巧妙地解決了這個問題,Kotlin採用了同樣的解決方案,只是語法形式不太同樣。
咱們來和Java語言作一個簡單的對比:this
Java
Room room = ...; if(null != room && null != room.window) { room.window.open(); }
Kotlin
val room: Room? = ... room?.window?.open()
從常識來講,咱們知道,一個房間可能會有窗戶,也可能沒有窗戶,若是沒有窗戶,調用open方法天然就會出現空指針異常。Java語言的處理方式是在調用該方法以前進行空值判斷,而Kotlin語言則使用?操做符進行控制,意思就是,若是?前面的對象爲空,則直接返回空值,後面的語句再也不執行。其有一個專業叫法: Optinal Value (可選值).
相對於Java語言,Kotlin語言的處理方式簡單了許多,更重要的是:媽媽不再用擔憂個人程序出現空指針異常了 -_-
細心的讀者應該能夠發現,Kotlin語言將分號也去掉了,這和Swift語言的處理方式也是一致的。
關於Optional Value的具體用法,後面我會專門用一個章節來給你們講解,請期待後面個人Kotlin語言系列教程。
Function
在Kotlin語言中,類終於再也不是一等公民。Kotlin語言開始支持面向過程編程,Kotlin語言中能夠聲明全局函數,內聯函數等,還支持函數嵌套,使用函數做爲方法參數等操做。對於一些簡單的操做,新建一個類去處理,的確有時候是一個讓人頭疼的問題,Kotlin語言終於讓咱們擺脫了這一尷尬的現狀。
來看一看函數聲明的簡單寫法,也和Java語言作一個簡單的對比
Java
public Sting sayHello(String name) { return "Hello, " + name; }
Kotlin
fun String sayHello(name: String?): String { return "Hello, $name" }
函數的寫法有較大的不一樣,Kotlin語法相似Swift語言的寫法,每一個函數都必須使用fun關鍵字聲明,參數類型在後,參數名稱在前,對於Java語言開發的同窗能夠須要一個短暫的適應過程。
一樣地,我會在後面的文章中專門對Kotlin函數進行講解
Lambdas
閉包應該是Java程序員很是期待的一個特性,並且幸運的是,Java8已經開始支持這一特性。兩者很是類似,咱們來和Java8的閉包作一個簡單的對比
Java8
interface Sum { int add(int x,int y); } Sum sum = (x,y) -> x + y
Kotlin
val sum: (Int,Int) -> Int = { x,y -> x + y }
能夠看到,兩者的語法很是相似,一樣支持類型推導,支持簡寫;不一樣的是,因爲Java語言徹底面向對象的特性,閉包必須與接口一一對應,而Kotlin語言因爲自然支持函數編程,能夠不用聲明對應接口,直接在參數中使用便可。
Extension
這是我最喜歡的一個特性,Kotlin語言支持對現有的類進行擴展。Java程序員應該會對這個特性比較陌生,這也是Swift語言的一個特性之一。所謂擴展,就是在不使用繼承的狀況下,對現有的類新增方法,屬性等操做,擴展不會破壞現有的類方法,僅僅在使用的時候進行動態添加。應該記住一個原則: 擴展優於繼承
而這個特性Java語言並不支持。
Kotlin
fun MutableList<Int>.swap(index1: Int, index2: Int) { val tmp = this[index1] // 'this' corresponds to the list this[index1] = this[index2] this[index2] = tmp }
Data Class
在開發過程當中,咱們經常要不斷寫一些Model類,不斷地使用開發工具生成set/get方法。Data Class就是爲簡化這個操做而生的,數據類會自動生成set/get方法,而不用顯式生成set/get方法,看下面的簡單用法:
Kotlin
data class Person(var name: String?,var age: Int?)
僅僅使用這樣一行代碼就完成Model類的建立,Kotlin會自動幫咱們生成set/get方法,極大地簡化了Model類的編寫工做。不過,Java程序員也不用太羨慕,不少Java框架也能夠實現這一點,好比Google推出的Auto Value框架等等
Operator Overloading
這個特性在Swift語言中也存在,在C++語言中也存在。這個特性是一把雙刃劍,使用操做符重載能夠簡化使用,也會損失一些代碼可讀性。因此,在使用操做符重載的時候,請慎重考慮。
關於Kotlin語言的特性一時半會也說不完,下面咱們就一些比較重要的特性和Java語言作一個簡單的對比:
語言特性 | Kotlin | Java |
---|---|---|
Null Safe | 支持 | Java8支持 |
全局函數 | 支持 | 不支持 |
Lambdas | 支持 | Java8支持 |
Extension | 支持 | 不支持 |
Data Class | 支持 | 不支持(須要依賴框架) |
Operator Overloading | 支持 | 不支持 |
Java語言徹底互通
你可能會擔憂使用Kotlin語言以後,以前的Java代碼怎麼辦。這個擔憂是徹底多餘的,JetBrains保證Kotlin和Java語言能夠實現徹底地互相調用,Kotlin最終也會編譯成Java字節碼。
Kotlin語言優點
有網友統計,使用Kotlin語言大約能夠減小30%的代碼編寫,同時也不用再擔憂空指針異常,因爲JetBrains的自然基因,Kotlin能夠得到較好的維護、升級。最後,對於Oracle公司對Google的頻繁訴訟,這也算是一個很好的還擊。在Kotlin語言發佈以後,國外已經有不少開發人員推出了大量好用的Kotlin框架,你能夠不用重複創造輪子。同時,Kotlin語言能夠和Java語言實現無縫鏈接,你還在等什麼呢?
建議
對於Kotlin語言,大部分開發人員都對Kotlin語言抱有積極態度。我本人也很是推崇Kotlin語言,若是你熟悉相似Python,Ruby等腳本語言,亦或者熟悉Swift語言,Kotlin語言將是你不二的選擇。而若是你已經厭倦了Java語言冗餘繁雜的寫法,Kotlin語言也很是值得一試,相信你也會像我同樣愛上這門語言。