Kotlin是什么

編者注:Google I/O 2017 首日 Keynote 剛剛落幕惊畏,其中 Google 宣布 Android 系統(tǒng)將對(duì) Kotlin 提供 first-class 的支持算是一個(gè)非常重磅的新聞。對(duì)于大眾來說密任,Kotlin 編程語言可能是相對(duì)陌生的颜启,它究竟有何過人之處呢?不如讓我們聽聽開發(fā)者是怎么說的浪讳。
  寫在前面的話缰盏,作為一個(gè)不熬夜的人,一覺醒來發(fā)現(xiàn) Kotlin 成為了 Android 的官方語言淹遵,可謂是大喜過望口猜。為了趁熱打鐵,我決定提前三天放出原定本周日 Release 的文章透揣。希望能及時(shí)讓大家了解一下 Kotlin济炎。
  相信很多開發(fā)人員,尤其是 Android 開發(fā)者都會(huì)或多或少聽說過 Kotlin辐真,當(dāng)然如果沒有聽過或者不熟悉也沒有關(guān)系须尚。因?yàn)楸酒恼乱约安┛秃笃诘膬?nèi)容會(huì)涉及到很多關(guān)于 Kotlin 的知識(shí)分享崖堤。
  在寫這篇文章前的一個(gè)多月,F(xiàn)lipboard 中國(guó)的 Android 項(xiàng)目確定了正式將 Kotlin 作為項(xiàng)目開發(fā)語言恨闪,這就意味著新增的代碼文件將以 Kotlin 代碼格式出現(xiàn)倘感,而且同時(shí)舊的 Java 代碼也將會(huì)陸陸續(xù)續(xù)翻譯成 Kotlin 代碼。在使用 Kotlin 的這段時(shí)間咙咽,被它的簡(jiǎn)潔老玛,高效,快捷等等特點(diǎn)震撼钧敞,所以有必要寫一篇文章來談一談 Kotlin 的特性蜡豹,如若能取得推廣 Kotlin 的效果則倍感欣慰。
  Kotlin的「簡(jiǎn)歷」
來自于著名的 IDE IntelliJ IDEA(Android Studio 基于此開發(fā)) 軟件開發(fā)公司 JetBrains(位于東歐捷克)
起源來自 JetBrains 的圣彼得堡團(tuán)隊(duì)溉苛,名稱取自圣彼得堡附近的一個(gè)小島 (Kotlin Island)
一種基于 JVM 的靜態(tài)類型編程語言

來自知名的工具開發(fā)商 JetBrains镜廉,也就決定了 Kotlin 的基因中必然包含實(shí)用與高效等特征。那我們接下來看一看 Kotlin 的特點(diǎn)愚战,當(dāng)然這也是我改用 Kotlin 的重要原因娇唯。
  語法簡(jiǎn)單,不啰嗦

  

Kotlin 支持類型推斷寂玲,沒有 Java 那樣的啰嗦塔插。
另外用 var 表示變量,val 表示常量更加的簡(jiǎn)潔

方法也很簡(jiǎn)單拓哟,連 function 都縮寫成了 fun想许,平添了幾分雙關(guān)之意。
類的繼承和實(shí)現(xiàn)很簡(jiǎn)單断序,使用:即可
Kotlin 每個(gè)句子都不需要加分號(hào) (;)

空指針安全  空指針(NullPointerException 或 NPE)是我們使用 Java 開發(fā)程序中最常見的崩潰了流纹。因?yàn)樵?Java 中我們不得不寫很多防御性的代碼,比如這樣:

  

  在 Kotlin 中空指針異常得到了很好的解決违诗。

在類型上的處理漱凝,即在類型后面加上?,即表示這個(gè)變量或參數(shù)以及返回值可以為 null诸迟,否則不允許為變量參數(shù)賦值為 null 或者返回 null
對(duì)于一個(gè)可能是 null 的變量或者參數(shù)茸炒,在調(diào)用對(duì)象方法或者屬性之前,需要加上?亮蒋,否則編譯無法通過扣典。

如下面的代碼就是 Kotlin 實(shí)現(xiàn)空指針安全的一個(gè)例子妆毕,而且相對(duì) Java 實(shí)現(xiàn)而言慎玖,簡(jiǎn)直是一行代碼搞定的。
  


  關(guān)于空指針安全的原理笛粘,可以參考這篇文章研究學(xué)習(xí)Kotlin的一些方法趁怔。
  支持方法擴(kuò)展
  很多時(shí)候湿硝,F(xiàn)ramework 提供給我們的 API 往往都時(shí)比較原子的,調(diào)用時(shí)需要我們進(jìn)行組合處理润努,因?yàn)榫蜁?huì)產(chǎn)生了一些 Util 類关斜,一個(gè)簡(jiǎn)單的例子,我們想要更快捷的展示 Toast 信息铺浇,在 Java 中我們可以這樣做痢畜。
  

  但是 Kotlin 的實(shí)現(xiàn)卻讓人驚奇,我們只需要重寫擴(kuò)展方法就可以了鳍侣,比如這個(gè) longToast 方法擴(kuò)展到所有的 Context 對(duì)象中丁稀,如果不去追根溯源,可能無法區(qū)分是 Framework 提供的還是自行擴(kuò)展的倚聚。
  

  注意:Kotlin 的方法擴(kuò)展并不是真正修改了對(duì)應(yīng)的類文件线衫,而是在編譯器和 IDE 方面做得處理。使我們看起來像是擴(kuò)展了方法惑折。
  Lambda, 高階函數(shù)授账,Streams API, 函數(shù)式編程支持
  所謂的 Lambda 表達(dá)式是匿名函數(shù),這使得我們的代碼會(huì)更加的簡(jiǎn)單惨驶。比如下面的代碼就是 lambda 的應(yīng)用白热。
  

  所謂的高階函數(shù)就是:
可以接受函數(shù)作為參數(shù)
也可以返回函數(shù)作為結(jié)果

舉一個(gè)接受函數(shù)作為參數(shù)的例子。在 Android 開發(fā)中敞咧,我們經(jīng)常使用 SharedPreference 來存儲(chǔ)數(shù)據(jù)棘捣,如果忘記調(diào)用 apply 或者 commit 則數(shù)據(jù)修改不能應(yīng)用。利用 Kotlin 中的高階函數(shù)的功能休建,我們能更好的解決這個(gè)問題:
  


  當(dāng)然這上面的例子中我們也同時(shí)使用了方法擴(kuò)展這個(gè)特性乍恐。
  Kotlin 支持了 Streams API 和方法引用,這樣函數(shù)式編程更加方便测砂。比如下面的代碼就是我們結(jié)合 Jsoup茵烈,來抓取某個(gè) proxy 網(wǎng)站的數(shù)據(jù),代碼更加簡(jiǎn)單砌些,實(shí)現(xiàn)起來也快速呜投。
  

  字符串模板
  無論是 Java 還是 Android 開發(fā),我們都會(huì)用到字符串拼接存璃,比如進(jìn)行日志輸出等等仑荐。在 Kotlin 中,字符串模板是支持的纵东,我們可以很輕松的完成一個(gè)字符串?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 對(duì) 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)起來要快很多缩歪。

  

  關(guān)于性能
  Kotlin 的執(zhí)行效率和 Java 代碼的執(zhí)行效率理論上一致的。有時(shí)候 Kotlin 可能會(huì)顯得高一些谍憔,比如 Kotlin 提供了方法的 inline 設(shè)置匪蝙,可以設(shè)置某些高頻方法進(jìn)行 inline 操作,減少了運(yùn)行時(shí)的進(jìn)棧出棧和保存狀態(tài)的開銷习贫。

  讀到這里逛球,是不是想要嘗試一下 Kotlin 呢,它簡(jiǎn)潔的語法苫昌,匯集諸多特性颤绕,高效率實(shí)現(xiàn)等等,已經(jīng)在國(guó)外風(fēng)生水起祟身,國(guó)外的 Pintereset, Square, Flipboard 等公司已經(jīng)開始應(yīng)用到生產(chǎn)中奥务。
  關(guān)于轉(zhuǎn)向 Kotlin
  其實(shí),我在做決定之前(當(dāng)時(shí) Kotlin 還沒有被欽定)也曾有過考慮袜硫,是不是選擇了 Kotlin 就意味著放棄 Java 呢氯葬,冷靜下來想一想,其實(shí)并不是那么回事婉陷,因?yàn)?Kotlin 與 Java 語法太相近帚称,以及在 Kotlin 中無時(shí)無刻不在和 Java 相關(guān)的東西打交道,所以這點(diǎn)顧慮不是問題的秽澳。
  對(duì)于個(gè)人的項(xiàng)目來轉(zhuǎn)向 Kotlin闯睹,通常不是很難的選擇,畢竟 Kotlin 是那么優(yōu)秀的語言担神,相信很多人還是愿意嘗試并使用這個(gè)事半功倍的語言的楼吃。
  而比較難抉擇的情況是如果如何讓團(tuán)隊(duì)轉(zhuǎn)用 Kotlin,個(gè)人認(rèn)為團(tuán)隊(duì)難以轉(zhuǎn)用的原因有很多,比如學(xué)習(xí)成本所刀,歷史包袱等等。但其實(shí)根本原因還是思維方式的問題捞挥,歪果仁喜歡用工具來提升開發(fā)效率浮创,因?yàn)槿肆Τ杀竞芨摺6鴩?guó)內(nèi)團(tuán)隊(duì)提高效率的辦法通常是增加成員砌函。好在 Flipboard 美國(guó)團(tuán)隊(duì)自 2015 年(可能更早)就引入了 Kotlin斩披,因此中國(guó)團(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ì)厕倍。
  做個(gè)比較現(xiàn)實(shí)的比擬,Java 就像是一趟從我的家鄉(xiāng)保定開往北京西的耗時(shí)將近 2 個(gè)小時(shí)甚至更長(zhǎng)的普通列車贩疙,而 Kotlin 則是那趟僅需 40 分鐘就能到達(dá)的高鐵讹弯。通常的人都會(huì)選擇高鐵,因?yàn)樗?jié)省了時(shí)間和提高了體驗(yàn)这溅。這個(gè)時(shí)間和體驗(yàn)對(duì)應(yīng)編程中的组民,我想應(yīng)該是高效率和高可讀性,可維護(hù)性的代碼悲靴。
  現(xiàn)在好了臭胜,有了 Google 的支持,Kotlin 轉(zhuǎn) Android 相信在不久的將來就會(huì)全面展開癞尚。篡改 Python 的一句名言「人生苦短耸三,我用 Kotlin」,這樣一個(gè)高效實(shí)用的語言應(yīng)該會(huì)被越來越多的團(tuán)隊(duì)所接受浇揩,并應(yīng)用到開發(fā)生產(chǎn)中吕晌。當(dāng)然也希望在國(guó)內(nèi)環(huán)境下大放異彩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末临燃,一起剝皮案震驚了整個(gè)濱河市睛驳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膜廊,老刑警劉巖乏沸,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異爪瓜,居然都是意外死亡蹬跃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門铆铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝶缀,“玉大人丹喻,你說我怎么就攤上這事∥潭迹” “怎么了碍论?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)柄慰。 經(jīng)常有香客問我鳍悠,道長(zhǎng),這世上最難降的妖魔是什么坐搔? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任藏研,我火速辦了婚禮,結(jié)果婚禮上概行,老公的妹妹穿的比我還像新娘蠢挡。我一直安慰自己,他們只是感情好凳忙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布袒哥。 她就那樣靜靜地躺著,像睡著了一般消略。 火紅的嫁衣襯著肌膚如雪堡称。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天艺演,我揣著相機(jī)與錄音却紧,去河邊找鬼。 笑死胎撤,一個(gè)胖子當(dāng)著我的面吹牛晓殊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伤提,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼巫俺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了肿男?” 一聲冷哼從身側(cè)響起介汹,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吴超,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年愉耙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片督弓。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芦圾,死狀恐怖骤竹,靈堂內(nèi)的尸體忽然破棺而出帝牡,到底是詐尸還是另有隱情,我是刑警寧澤蒙揣,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布靶溜,位于F島的核電站,受9級(jí)特大地震影響鸣奔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惩阶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一挎狸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧断楷,春花似錦锨匆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舞痰,卻和暖如春土榴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背响牛。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工玷禽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呀打。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓矢赁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贬丛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撩银,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容