Android開發(fā)新選擇:Kotlin

iOS 開發(fā)已經(jīng)有了新的開發(fā)語言:Swift,Android 陣營依舊還是 Java蝶念。在 Andriod 開發(fā)中我們有沒有其他語言可以選擇呢翰蠢?當(dāng)然有,今天就給大家介紹 Android 的一種開發(fā)語言 Kotlin。

何為 Kotlin葵蒂?

Kotlin是JetBrains公司開發(fā)的基于JVM的一門靜態(tài)語言交播,可用于開發(fā) JavaEE,Android践付,Web等秦士。整體來說,Kotlin有以下幾個(gè)特點(diǎn):

簡潔:大量重復(fù)的模版代碼不用寫了永高,如 JavaBean/POJO 可以用 Kotlin 的 data class 替代隧土。

安全:空指針等異常在語言層面被處理掉了,不用去寫各種判空操作命爬。

函數(shù)式編程:lambda曹傀,filter,map饲宛,reduce皆愉。有了這些特性,效率又提高了不少艇抠。

與 Java 完美結(jié)合:Kotlin 可以完美復(fù)用現(xiàn)有 Java 代碼亥啦,不用去重寫,反過來也適用练链。

針對 Android 開發(fā):終于可以不用一遍又一遍的去寫 findViewById 了(也不需要用注解的方式)翔脱。

Kotlin 初見

簡單介紹完 Kotlin 之后,我們用一個(gè)簡單的例子來體驗(yàn)一下 Kotlin媒鼓。

1)配置開發(fā)環(huán)境

由于 Android Studio 默認(rèn)是不安裝 Kotlin plugin 的届吁,首先我們需要安裝 Kotlin plugin。

安裝完后重啟绿鸣,創(chuàng)建一個(gè)普通的?Android Project 項(xiàng)目疚沐;然后打開我們的 MainActivity;接著打開菜單 Code->Convert Java File To Kotlin File潮模。完成之后亮蛔,我們就可以使用 Kotlin 寫代碼了。

當(dāng) Project 轉(zhuǎn)換為 Kotlin 項(xiàng)目時(shí)擎厢,項(xiàng)目中的 build.gradle 文件會(huì)發(fā)生改變究流。

Project/build.gradle:

Project/app/build.gradle:

項(xiàng)目環(huán)境配置完畢,接下來我們就來編寫一行代碼动遭。Android 布局文件中有一個(gè)?Button 和一個(gè)?TextView芬探,代碼實(shí)現(xiàn)點(diǎn)擊?Button?時(shí)改變?TextView?的值

一行代碼即可實(shí)現(xiàn),而在Java 中我們是這樣實(shí)現(xiàn)如上功能:

為何使用 Kotlin 精簡掉那么多代碼厘惦?

首先就是我們的 layout 文件中所有的控件被當(dāng)成類一樣 import 進(jìn)來偷仿。import kotlinx.android.synthetic.main.activity_main.*控件的 id 就是其變量名,我們再也不用像以前一樣先要聲明這個(gè)控件,然后再去 findViewById 了酝静。

在 Kotlin 中l(wèi)ambda 表達(dá)式是自帶的节榜,我們可以用 lambda 表達(dá)式去寫各種 Listener 來減少代碼量。

Kotlin 快速入門

這里我介紹一些Kotlin 最常用和簡單的用法:

1) 定義變量和常量

2)方法/函數(shù)

方法的定義和 Java 略有不同别智。方法參數(shù)名在前全跨,參數(shù)類型在后,返回值也是寫在方法參數(shù)定義之后亿遂。

重載父類方法:

方法擴(kuò)展:

Kotlin 可以在不修改原始類的情況下浓若,給類增加新的功能(方法),如下面代碼給Button 新添加了一個(gè)方法 doubleClick:

使用起來很簡單蛇数,就和調(diào)用 Button 自有方法一樣:

當(dāng)使用其他類庫時(shí)挪钓,我們覺得這個(gè)類庫功能不夠強(qiáng)大,那么就可以直接給這個(gè)類添加方法耳舅,而不需要通過繼承去實(shí)現(xiàn)碌上。

3)List

用法和?Java?中的 List 用法基本一樣。不同的是浦徊,Kotlin?的?List?添加了操作?List?的高階函數(shù)馏予,可以更方便的對 List 進(jìn)行操作。

4)Map

Map 的用法和 Java 的 Map 也基本一樣盔性,不同的是霞丧,mapOf 方法生成的 map 是不可以添加和刪除元素的,mutableMapOf 方法生成的 Map 是可以修改的冕香。Map 中也添加了諸多高階函數(shù)可以更方便的對 Map 進(jìn)行修改:map.map蛹尝,map.flatMap,map.filter 等等悉尾,使用起來和 RxJava 用法很像突那。

5)條件語句以及循環(huán)語句

Kotlin 條件語句中if..else..語法結(jié)構(gòu)和 Java 基本一致,取消了 switch 語句构眯,新增了一個(gè)功能更加強(qiáng)大的when 語句來代替 switch愕难。示例,根據(jù)成績得到相應(yīng)的分?jǐn)?shù)評級:

Kotlin 特性

Kotlin 中有一些 Java 中沒有的惫霸,能夠提高開發(fā)效率的新特性猫缭。

1)數(shù)據(jù)類(Data Class)

在 Android 實(shí)際開發(fā)中,我們需要給每一個(gè) API 返回的數(shù)據(jù)定義一個(gè)數(shù)據(jù)類它褪,如下:

而在 Kotlin 的 Data Class 中我們是這樣寫的:

一行代碼就搞定饵骨!Java 中寫 JavaBean 時(shí)翘悉,我們需要去寫 equals()方法茫打,hashCode()方法,toString()方法。如果寫方法的過程中出了問題老赤,那么在 HashMap 中轮洋,我們很有可能就會(huì)遇到隱蔽的內(nèi)存泄漏問題,這種問題很難調(diào)試抬旺。

而 Kotlin 的 data class 會(huì)自動(dòng)根據(jù)內(nèi)容去生成這幾個(gè)方法弊予,不需要我們再寫 get/set equals 等煩人的方法了。

2)空安全(Null Safety)

每一個(gè)開發(fā)人員都會(huì)遇到這樣的問題:在使用某個(gè)對象時(shí)开财,我們必須得考慮這個(gè)對象是否為空汉柒。如果對象可能為空,我們不得不需要寫 if(object != null) 之類的代碼责鳍,如果判斷條件寫反碾褂,或者少寫了一個(gè)條件判斷,應(yīng)用就會(huì)在 QA 運(yùn)行時(shí) Crash 了历葛。我們千辛萬苦寫的代碼正塌,到頭來卻被各種 NullPointerException 害苦。而現(xiàn)在 Kotlin Null Safety 能幫助我們節(jié)省時(shí)間恤溶,脫離空指針的苦海乓诽。

Kotlin 定義變量有兩種方式,可以為 Null 和不可以為 Null咒程。在變量類型后面加鸠天?表示該變量可以為 Null

使用一個(gè)變量的三種方法:

至此帐姻,再也不用擔(dān)心哪里漏寫了判空操作而引發(fā)空指針異常了粮宛。

3)函數(shù)式編程

對于函數(shù)式編程,Kotlin 比 Java 有了很大的提升卖宠。lambda 表達(dá)式和眾多的內(nèi)置高階函數(shù)巍杈,可以使我們的開發(fā)效率以及代碼的可讀性有了進(jìn)一步的提高。這里介紹比較常用的幾個(gè)高階函數(shù):

1.lambda 表達(dá)式

在 Java8 中已經(jīng)有 lambda 了扛伍,但是我們想要在 Andorid 開發(fā)中應(yīng)用這個(gè)特性筷畦,需用 jack 來編譯。目前 jack 還不是很完整刺洒,而且很多插件也不支持 jack鳖宾。所以我們只能退而求其次使用 retroLambda。

現(xiàn)在 Kotlin 純天然支持 lambda逆航,不需要換編譯工具鼎文,也不需要使用第三方插件,而且比前者更好用因俐。本文開頭第一個(gè)例子就是使用 lambda 來完成的拇惋。

2.map

map 是一個(gè)高階函數(shù)周偎,參數(shù)是一個(gè)變換函數(shù),將變換函數(shù)作用于集合中的每一項(xiàng)元素中撑帖,從而返回一個(gè)新的集合蓉坎。使用 map 對集合中的每一項(xiàng)元素做自乘(f(x) = x*x)。實(shí)現(xiàn)如下:

3.reduce

reduce 同樣是一個(gè)高階函數(shù)胡嘿,參數(shù)是一個(gè)變換函數(shù)蛉艾,該變換函數(shù)有兩個(gè)參數(shù),將該變換函數(shù)作用于集合中的元素上衷敌,把返回的結(jié)果繼續(xù)和下一個(gè)元素做累計(jì)勿侯。例如對集合中的所有元素做累加計(jì)算:

4.filter

filter 是 Kotlin 在集合中加入的高階函數(shù),方便對集合進(jìn)行篩選操作缴罗。示例罐监,篩選 List 中的偶數(shù):

Map 集合對應(yīng)的 filter 是 filterKey 和 filterValue,用法和 List 的 filter 是基本一致的瞒爬。

小結(jié)

由于篇幅所限弓柱,Kotlin 還有諸多特性(類擴(kuò)展,DSL 等)并未介紹侧但,請期待后續(xù)分享矢空。

Kotlin 有諸多的優(yōu)點(diǎn),我們該不該學(xué)習(xí)禀横、使用呢屁药?Kotlin 是值得我們學(xué)習(xí)的,但是若要應(yīng)用于線上項(xiàng)目柏锄,還是需要我們慎重考慮酿箭。畢竟 Android 的官方開發(fā)語言仍然是 Java,萬一后面 Android 發(fā)布個(gè)新特性趾娃,Kotlin 不支持就悲劇了缭嫡。

本文作者:房建斌?(點(diǎn)融黑幫),就職于點(diǎn)融網(wǎng)工程部 Client ?team抬闷,Android 開發(fā)工程師一枚妇蛀,專注 java 和 android 技術(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笤成,一起剝皮案震驚了整個(gè)濱河市评架,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炕泳,老刑警劉巖纵诞,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異培遵,居然都是意外死亡浙芙,警方通過查閱死者的電腦和手機(jī)登刺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茁裙,“玉大人塘砸,你說我怎么就攤上這事节仿∥钭叮” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵廊宪,是天一觀的道長矾瘾。 經(jīng)常有香客問我,道長箭启,這世上最難降的妖魔是什么壕翩? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮傅寡,結(jié)果婚禮上放妈,老公的妹妹穿的比我還像新娘。我一直安慰自己荐操,他們只是感情好芜抒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著托启,像睡著了一般宅倒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屯耸,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天拐迁,我揣著相機(jī)與錄音,去河邊找鬼疗绣。 笑死线召,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的多矮。 我是一名探鬼主播灶搜,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼工窍!你這毒婦竟也來了割卖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤患雏,失蹤者是張志新(化名)和其女友劉穎鹏溯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淹仑,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丙挽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年肺孵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颜阐。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡平窘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凳怨,到底是詐尸還是另有隱情瑰艘,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布肤舞,位于F島的核電站紫新,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏李剖。R本人自食惡果不足惜芒率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篙顺。 院中可真熱鬧偶芍,春花似錦、人聲如沸德玫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽化焕。三九已至萄窜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撒桨,已是汗流浹背查刻。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凤类,地道東北人穗泵。 一個(gè)月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像谜疤,于是被迫代替她去往敵國和親佃延。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

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