Android開發新選擇:Kotlin

編程語言 泛函編程 技術 點融黑幫 2017-04-14

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

Android開發新選擇:Kotlin

何為 Kotlin?

Kotlin是JetBrains公司開發的基於JVM的一門靜態語言,可用於開發 JavaEE,Android,Web等。整體來說,Kotlin有以下幾個特點:

簡潔:大量重複的模版代碼不用寫了,如 JavaBean/POJO 可以用 Kotlin 的 data class 替代。

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

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

與 Java 完美結合:Kotlin 可以完美複用現有 Java 代碼,不用去重寫,反過來也適用。

針對 Android 開發:終於可以不用一遍又一遍的去寫 findViewById 了(也不需要用註解的方式)。

Kotlin 初見

簡單介紹完 Kotlin 之後,我們用一個簡單的例子來體驗一下 Kotlin。

1)配置開發環境

由於 Android Studio 默認是不安裝 Kotlin plugin 的,首先我們需要安裝 Kotlin plugin。

Android開發新選擇:Kotlin

安裝完後重啟,創建一個普通的 Android Project 項目;然後打開我們的 MainActivity;接著打開菜單 Code->Convert Java File To Kotlin File。完成之後,我們就可以使用 Kotlin 寫代碼了。

當 Project 轉換為 Kotlin 項目時,項目中的 build.gradle 文件會發生改變。

Project/build.gradle:

Android開發新選擇:Kotlin

Project/app/build.gradle:

Android開發新選擇:Kotlin

項目環境配置完畢,接下來我們就來編寫一行代碼。Android 佈局文件中有一個 Button 和一個 TextView,代碼實現點擊 Button 時改變 TextView 的值

Android開發新選擇:Kotlin

Android開發新選擇:Kotlin

一行代碼即可實現,而在Java 中我們是這樣實現如上功能:

Android開發新選擇:Kotlin

為何使用 Kotlin 精簡掉那麼多代碼?

首先就是我們的 layout 文件中所有的控件被當成類一樣 import 進來。import kotlinx.android.synthetic.main.activity_main.*控件的 id 就是其變量名,我們再也不用像以前一樣先要聲明這個控件,然後再去 findViewById 了。

在 Kotlin 中lambda 表達式是自帶的,我們可以用 lambda 表達式去寫各種 Listener 來減少代碼量。

Kotlin 快速入門

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

1) 定義變量和常量

Android開發新選擇:Kotlin

2)方法/函數

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

Android開發新選擇:Kotlin

重載父類方法:

Android開發新選擇:Kotlin

方法擴展:

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

Android開發新選擇:Kotlin

使用起來很簡單,就和調用 Button 自有方法一樣:

Android開發新選擇:Kotlin

當使用其他類庫時,我們覺得這個類庫功能不夠強大,那麼就可以直接給這個類添加方法,而不需要通過繼承去實現。

3)List

用法和 Java 中的 List 用法基本一樣。不同的是,Kotlin 的 List 添加了操作 List 的高階函數,可以更方便的對 List 進行操作。

Android開發新選擇:Kotlin

4)Map

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

Android開發新選擇:Kotlin

5)條件語句以及循環語句

Kotlin 條件語句中if..else..語法結構和 Java 基本一致,取消了 switch 語句,新增了一個功能更加強大的when 語句來代替 switch。示例,根據成績得到相應的分數評級:

Android開發新選擇:Kotlin

Kotlin 特性

Kotlin 中有一些 Java 中沒有的,能夠提高開發效率的新特性。

1)數據類(Data Class)

在 Android 實際開發中,我們需要給每一個 API 返回的數據定義一個數據類,如下:

Android開發新選擇:Kotlin

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

Android開發新選擇:Kotlin

一行代碼就搞定!Java 中寫 JavaBean 時,我們需要去寫 equals()方法,hashCode()方法,toString()方法。如果寫方法的過程中出了問題,那麼在 HashMap 中,我們很有可能就會遇到隱蔽的內存洩漏問題,這種問題很難調試。

而 Kotlin 的 data class 會自動根據內容去生成這幾個方法,不需要我們再寫 get/set equals 等煩人的方法了。

2)空安全(Null Safety)

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

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

Android開發新選擇:Kotlin

使用一個變量的三種方法:

Android開發新選擇:Kotlin

至此,再也不用擔心哪裡漏寫了判空操作而引發空指針異常了。

3)函數式編程

對於函數式編程,Kotlin 比 Java 有了很大的提升。lambda 表達式和眾多的內置高階函數,可以使我們的開發效率以及代碼的可讀性有了進一步的提高。這裡介紹比較常用的幾個高階函數:

1.lambda 表達式

在 Java8 中已經有 lambda 了,但是我們想要在 Andorid 開發中應用這個特性,需用 jack 來編譯。目前 jack 還不是很完整,而且很多插件也不支持 jack。所以我們只能退而求其次使用 retroLambda。

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

2.map

map 是一個高階函數,參數是一個變換函數,將變換函數作用於集合中的每一項元素中,從而返回一個新的集合。使用 map 對集合中的每一項元素做自乘(f(x) = x*x)。實現如下:

Android開發新選擇:Kotlin

3.reduce

reduce 同樣是一個高階函數,參數是一個變換函數,該變換函數有兩個參數,將該變換函數作用於集合中的元素上,把返回的結果繼續和下一個元素做累計。例如對集合中的所有元素做累加計算:

Android開發新選擇:Kotlin

4.filter

filter 是 Kotlin 在集合中加入的高階函數,方便對集合進行篩選操作。示例,篩選 List 中的偶數:

Android開發新選擇:Kotlin

Map 集合對應的 filter 是 filterKey 和 filterValue,用法和 List 的 filter 是基本一致的。

小結

由於篇幅所限,Kotlin 還有諸多特性(類擴展,DSL 等)並未介紹,請期待後續分享。

Kotlin 有諸多的優點,我們該不該學習、使用呢?Kotlin 是值得我們學習的,但是若要應用於線上項目,還是需要我們慎重考慮。畢竟 Android 的官方開發語言仍然是 Java,萬一後面 Android 發佈個新特性,Kotlin 不支持就悲劇了。

本文作者:房建斌 (點融黑幫),就職於點融網工程部 Client team,Android 開發工程師一枚,專注 java 和 android 技術。

本文由@點融黑幫(ID:DianrongMafia)原創發佈於今日頭條,未經許可,禁止轉載。

相關推薦

推薦中...