kotlin入門(2)——什么是kotlin

什么是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)境下大放異彩只泼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卵洗,隨后出現(xiàn)的幾起案子请唱,更是在濱河造成了極大的恐慌,老刑警劉巖过蹂,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件十绑,死亡現(xiàn)場離奇詭異,居然都是意外死亡酷勺,警方通過查閱死者的電腦和手機(jī)孽惰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸥印,“玉大人勋功,你說我怎么就攤上這事坦报。” “怎么了狂鞋?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵片择,是天一觀的道長。 經(jīng)常有香客問我骚揍,道長字管,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任信不,我火速辦了婚禮嘲叔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抽活。我一直安慰自己硫戈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布下硕。 她就那樣靜靜地躺著丁逝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梭姓。 梳的紋絲不亂的頭發(fā)上霜幼,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音誉尖,去河邊找鬼罪既。 笑死,一個胖子當(dāng)著我的面吹牛铡恕,可吹牛的內(nèi)容都是我干的琢感。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼没咙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了千劈?” 一聲冷哼從身側(cè)響起祭刚,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墙牌,沒想到半個月后涡驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喜滨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年捉捅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虽风。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡棒口,死狀恐怖寄月,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情无牵,我是刑警寧澤漾肮,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站茎毁,受9級特大地震影響克懊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜七蜘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一谭溉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橡卤,春花似錦扮念、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谈为,卻和暖如春旅挤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伞鲫。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工粘茄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秕脓。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓柒瓣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吠架。 傳聞我的和親對象是個殘疾皇子芙贫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344