什么是kotlin?
Kotlin 是一個用于現(xiàn)代多平臺應(yīng)用的靜態(tài)編程語言 [1]方面,由JetBrains開發(fā)晨横。
Kotlin可以編譯成Java字節(jié)碼,也可以編譯成JavaScript织盼,方便在沒有JVM的設(shè)備上運(yùn)行毁葱。
Kotlin已正式成為Android官方支持開發(fā)語言奕坟。
100%兼容Java
Kotlin-Js前端開發(fā)
Kotlin-Jvm服務(wù)端開發(fā)
Kotlin-Native 本地執(zhí)行程序
Kotlin發(fā)展歷程
2010 立項(xiàng)
2011.6 對外公開
2012.2 開源
2013.8 支持Android Studio
2014.6 全新開源web站點(diǎn)和域名Kotlinlang.org
2016.2 發(fā)布1.0
2016.9 發(fā)布1.0.4 支持apt
官方文檔https://kotlinlang.org/docs/reference
Kotlin源碼https://github.com/JetBrains/kotlin
Kotlin官博https://blog.jetbrains.com/kotlin/
微信公眾號 Kotlin
Gradle文檔
https://docs.gradle.org/current/userguide/userguide.html
使用Kotlin進(jìn)行Android開發(fā)
Kotlin非常適合開發(fā)Android應(yīng)用程序距潘,將現(xiàn)代語言的所有優(yōu)勢帶入Android平臺甜熔,而不會引入任何新的限制:
兼容性:Kotlin與JDK 6完全兼容蜓氨,確保Kotlin應(yīng)用程序可以在較舊的Android設(shè)備上運(yùn)行而不會出現(xiàn)問題聋袋。Android Studio完全支持Kotlin工具,并與Android構(gòu)建系統(tǒng)兼容穴吹。
性能:由于非常相似的字節(jié)碼結(jié)構(gòu)幽勒,Kotlin應(yīng)用程序的運(yùn)行速度與等效的Java應(yīng)用程序一樣快。由于Kotlin支持內(nèi)聯(lián)函數(shù)港令,使用lambda的代碼通常比使用Java編寫的相同代碼運(yùn)行得更快啥容。
互操作性:Kotlin與Java 100%互操作,允許在Kotlin應(yīng)用程序中使用所有現(xiàn)有的Android庫顷霹。這包括注釋處理咪惠,因此數(shù)據(jù)綁定和Dagger也可以工作。
足跡:Kotlin有一個非常緊湊的運(yùn)行時庫淋淀,可以通過使用ProGuard進(jìn)一步減少遥昧。在實(shí)際應(yīng)用程序中,Kotlin運(yùn)行時只添加幾百個方法,小于.apk文件大小的100K炭臭。
編譯時間:Kotlin支持高效的增量編譯永脓,因此雖然對于干凈的構(gòu)建有一些額外的開銷,但增量構(gòu)建通常比使用Java快或快鞋仍。
學(xué)習(xí)曲線:對于Java開發(fā)人員來說常摧,使用Kotlin非常容易。Kotlin插件中包含的自動Java to Kotlin轉(zhuǎn)換器有助于完成第一步威创。Kotlin Koans通過一系列互動練習(xí)提供語言主要功能的指南落午。
Kotlin for Android案例研究
Kotlin已成功被大公司采用,其中一些公司已經(jīng)分享了他們的經(jīng)驗(yàn):
Pinterest已成功將Kotlin引入其應(yīng)用程序肚豺,每月由1.5億人使用板甘。
Basecamp的Android應(yīng)用程序是100%Kotlin代碼,他們報告程序員的快樂和工作質(zhì)量和速度的巨大改進(jìn)的巨大差異详炬。
Keepsafe的App Lock應(yīng)用程序也已轉(zhuǎn)換為100%Kotlin,導(dǎo)致源代碼數(shù)減少30%寞奸,方法數(shù)減少10%呛谜。
Android開發(fā)工具
Kotlin團(tuán)隊(duì)為Android開發(fā)提供了一套超越標(biāo)準(zhǔn)語言功能的工具:
Kotlin Android Extensions是一個編譯器擴(kuò)展,允許您擺脫findViewById()代碼中的調(diào)用枪萄,并用合成編譯器生成的屬性替換它們隐岛。
Anko是一個庫,提供圍繞Android API的一組Kotlin友好包裝器瓷翻,以及一個允許您使用Kotlin代碼替換布局.xml文件的DSL聚凹。
kotlin的小特點(diǎn)
kotlin支持類型推斷
var表示變量? val表示常量
fun表示方法
類的繼承和實(shí)現(xiàn)使用? ? :
kotlin的每個句子不需要 加分號 ;
空指針安全? 空指針(nullpointerexception或NPE)是我們使用Java最常見的崩潰齐帚,所以我們在Java中會寫許多防御性的代碼:
在kotlin中空指針的解決
在類型處理上妒牙,在類型的后面加上? ?? 表示這個變量參數(shù)賦值為null或者返回null
對于一個可能是null的變量或者參數(shù)对妄,在調(diào)用對象方法或者屬性之前湘今,需要加上? ?剪菱,否則編譯沒有辦法通過摩瞎,如圖。關(guān)于空指針安全的原理孝常,可以參考這篇文章研究學(xué)習(xí)Kotlin的一些方法旗们。
支持方法的擴(kuò)展
很多時候,framework提供給我們的API往往都是比較原子的构灸,調(diào)用的適合需要進(jìn)行組合處理上渴,因?yàn)闀a(chǎn)生一些util類,一個簡單的例子,我們想要更快的去展示一個toast信息驰贷,在Java中
在kotlin中我們只需要重寫擴(kuò)展方法就可以了盛嘿,
注意:kotlin的方法擴(kuò)展并不是真正修改了對應(yīng)的類文件,而是在編譯器和IDE方面做了處理括袒,使我們看起來更像是擴(kuò)展方法次兆。
Lambda,高階函數(shù),Streams API锹锰,函數(shù)式編程支持
所謂的lambda表達(dá)式是匿名函數(shù)芥炭,這使得我們的代碼會更加簡單,
高階函數(shù)通俗的講就是可以接受函數(shù)作為參數(shù)恃慧,也可以返回函數(shù)作為結(jié)果
舉一個接受函數(shù)作為參數(shù)的例子园蝠,在Android開發(fā)中,我們經(jīng)常的使用sharedpreference來存儲數(shù)據(jù)痢士,如果忘記調(diào)用apply或者commit則數(shù)據(jù)修改是不能應(yīng)用彪薛,利用kotlin中的高階函數(shù)的功能可以解決這個問題。同時也使用了方法擴(kuò)展這個特性怠蹂。
kotlin支持streams API和方法的引用善延,使函數(shù)式編程更加的方便,下圖就是結(jié)合jsoup,來抓取某個proxy網(wǎng)站的數(shù)據(jù)城侧,代碼更加簡單易遣,實(shí)現(xiàn)起來也快速。
字符串模板
無論是 Java 還是 Android 開發(fā)嫌佑,我們都會用到字符串拼接豆茫,比如進(jìn)行日志輸出等等。在 Kotlin 中屋摇,字符串模板是支持的揩魂,我們可以很輕松的完成一個字符串?dāng)?shù)組的組成。
注意:關(guān)于字符串拼接可以參考這篇文章Java細(xì)節(jié):字符串的拼接炮温。
與 Java 交互性好
Kotlin 和 Java 都屬于基于 JVM 的編程語言肤京。Kotlin 和 Java 的交互性很好,可以說是無縫連接茅特。
這表現(xiàn)在:
Kotlin 可以自由的引用 Java 的代碼忘分,反之亦然。
Kotlin 可以現(xiàn)有的全部的 Java 框架和庫
Java 文件可以很輕松的借助 IntelliJ 的插件轉(zhuǎn)成 kotlin
Kotlin 應(yīng)用廣泛? Kotlin 對 Android 應(yīng)用開發(fā)支持廣泛白修,諸多工具妒峦,比如 kotterknife(ButterKnife Kotlin 版),RxKotlin,Anko 等等兵睛,當(dāng)然還有已經(jīng)存在的很多 Java 的庫都是可以使用的肯骇。
除此之外窥浪,Kotlin 也可以編譯成 Java。最近使用 Kotlin 寫了一段抓取 proxy 的代碼笛丙,實(shí)現(xiàn)起來非逞快捷。甚至比純 Java 實(shí)現(xiàn)起來要快很多胚鸯。
相比Java 7的優(yōu)勢到底是什么呢骨稿?
它更加易表現(xiàn):這是它最重要的優(yōu)點(diǎn)之一。你可以編寫少得多的代碼姜钳。
它更加安全:Kotlin是空安全的坦冠,也就是說在我們編譯時期就處理了各種null的情況,避免了執(zhí)行時異常哥桥。如果一個對象可以是null辙浑,則我們需要明確地指定它,然后在使用它之前檢查它是否是null拟糕。你可以節(jié)約很多調(diào)試空指針異常的時間判呕,解決掉null引發(fā)的bug。
它是函數(shù)式的:Kotlin是基于面向?qū)ο蟮恼Z言送滞。但是就如其他很多現(xiàn)代的語言那樣佛玄,它使用了很多函數(shù)式編程的概念,比如累澡,使用lambda表達(dá)式來更方便地解決問題。其中一個很棒的特性就是Collections的處理方式般贼。
它可以擴(kuò)展函數(shù):這意味著我們可以擴(kuò)展類的更多的特性愧哟,甚至我們沒有權(quán)限去訪問這個類中的代碼
它是高度互操作性的:你可以繼續(xù)使用所有的你用Java寫的代碼和庫,因?yàn)閮蓚€語言之間的互操作性是完美的哼蛆。甚至可以在一個項(xiàng)目中使用Kotlin和Java兩種語言混合編程蕊梧。
關(guān)于性能
Kotlin 的執(zhí)行效率和 Java 代碼的執(zhí)行效率理論上一致的。有時候 Kotlin 可能會顯得高一些腮介,比如 Kotlin 提供了方法的 inline 設(shè)置肥矢,可以設(shè)置某些高頻方法進(jìn)行 inline 操作,減少了運(yùn)行時的進(jìn)棧出棧和保存狀態(tài)的開銷叠洗。
關(guān)于轉(zhuǎn)向 Kotlin
其實(shí)甘改,我在做決定之前也曾有過考慮,是不是選擇了 Kotlin 就意味著放棄 Java 呢灭抑,冷靜下來想一想十艾,其實(shí)并不是那么回事,因?yàn)?Kotlin 與 Java 語法太相近腾节,以及在 Kotlin 中無時無刻不在和 Java 相關(guān)的東西打交道忘嫉,所以這點(diǎn)顧慮不是問題的荤牍。
對于個人的項(xiàng)目來轉(zhuǎn)向 Kotlin,通常不是很難的選擇庆冕,畢竟 Kotlin 是那么優(yōu)秀的語言康吵,相信很多人還是愿意嘗試并使用這個事半功倍的語言的。
而比較難抉擇的情況是如果如何讓團(tuán)隊(duì)轉(zhuǎn)用 Kotlin访递,個人認(rèn)為團(tuán)隊(duì)難以轉(zhuǎn)用的原因有很多晦嵌,比如學(xué)習(xí)成本,歷史包袱等等力九。但其實(shí)根本原因還是思維方式的問題耍铜,歪果仁喜歡用工具來提升開發(fā)效率,因?yàn)槿肆Τ杀竞芨叩啊6鴩鴥?nèi)團(tuán)隊(duì)提高效率的辦法通常是增加成員棕兼。好在 Flipboard 美國團(tuán)隊(duì)自 2015 年(可能更早)就引入了 Kotlin,因此中國團(tuán)隊(duì)這邊選用 Kotlin 也更加順?biāo)浦鄣峙摇.?dāng)然更主要的是目前團(tuán)隊(duì)規(guī)模不大伴挚,成員一致認(rèn)可 Kotlin 的優(yōu)點(diǎn)。
關(guān)于團(tuán)隊(duì)轉(zhuǎn)用 Kotlin 的方法灾炭,一般比較行得通的辦法是自上而下的推行茎芋。這就意味著要么直接的技術(shù)負(fù)責(zé)人比較開明要么就是需要有人來不斷推介來影響團(tuán)隊(duì)。
現(xiàn)在好了蜈出,有了 Google 的支持田弥,Kotlin 轉(zhuǎn) Android 相信在不久的將來就會全面展開。篡改 Python 的一句名言「人生苦短铡原,我用 Kotlin」偷厦,這樣一個高效實(shí)用的語言應(yīng)該會被越來越多的團(tuán)隊(duì)所接受,并應(yīng)用到開發(fā)生產(chǎn)中燕刻。當(dāng)然也希望在國內(nèi)環(huán)境下大放異彩只泼。