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

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

何為 Kotlin?

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

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

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

函數(shù)式編程:lambda,filter,map,reduce。有了這些特性,效率又提高了不少。

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

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

Kotlin 初見(jiàn)

簡(jiǎn)單介紹完 Kotlin 之后,我們用一個(gè)簡(jiǎn)單的例子來(lái)體驗(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)境配置完畢,接下來(lái)我們就來(lái)編寫一行代碼。Android 布局文件中有一個(gè)?Button 和一個(gè)?TextView,代碼實(shí)現(xiàn)點(diǎn)擊?Button?時(shí)改變?TextView?的值

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

為何使用 Kotlin 精簡(jiǎn)掉那么多代碼?

首先就是我們的 layout 文件中所有的控件被當(dāng)成類一樣 import 進(jìn)來(lái)。import kotlinx.android.synthetic.main.activity_main.*控件的 id 就是其變量名,我們?cè)僖膊挥孟褚郧耙粯酉纫暶鬟@個(gè)控件,然后再去 findViewById 了。

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

Kotlin 快速入門

這里我介紹一些Kotlin 最常用和簡(jiǎn)單的用法:

1) 定義變量和常量

2)方法/函數(shù)

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

重載父類方法:

方法擴(kuò)展:

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

使用起來(lái)很簡(jiǎn)單,就和調(diào)用 Button 自有方法一樣:

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

3)List

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

4)Map

Map 的用法和 Java 的 Map 也基本一樣,不同的是,mapOf 方法生成的 map 是不可以添加和刪除元素的,mutableMapOf 方法生成的 Map 是可以修改的。Map 中也添加了諸多高階函數(shù)可以更方便的對(duì) Map 進(jìn)行修改:map.map,map.flatMap,map.filter 等等,使用起來(lái)和 RxJava 用法很像。

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

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

Kotlin 特性

Kotlin 中有一些 Java 中沒(méi)有的,能夠提高開發(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()方法。如果寫方法的過(guò)程中出了問(wèn)題,那么在 HashMap 中,我們很有可能就會(huì)遇到隱蔽的內(nèi)存泄漏問(wèn)題,這種問(wèn)題很難調(diào)試。

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

2)空安全(Null Safety)

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

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

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

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

3)函數(shù)式編程

對(duì)于函數(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 來(lái)編譯。目前 jack 還不是很完整,而且很多插件也不支持 jack。所以我們只能退而求其次使用 retroLambda。

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

2.map

map 是一個(gè)高階函數(shù),參數(shù)是一個(gè)變換函數(shù),將變換函數(shù)作用于集合中的每一項(xiàng)元素中,從而返回一個(gè)新的集合。使用 map 對(duì)集合中的每一項(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ì)。例如對(duì)集合中的所有元素做累加計(jì)算:

4.filter

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

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

小結(jié)

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容