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ù)。