Kotlin入門指南

此文章主要寫了我在學習kotlin的歷程中的一些感悟和體會。供入門的同學參考。

一、Kotlin優點

  • 1.擴展函數
  • 2.可空性(避免空指針)
  • 3.代碼簡潔,可讀性強
  • 4.高度互操作性(Kotlin與Java混合編程)
  • 5.函數式編程

1.擴展函數

我們可以給任何類添加函數,而不需要繼承它

例如:給View函數添加擴展函數,控制View的可見性

view的可見性我們一般寫成

image.png

我們可以通過擴展函數來定義方法

image.png

現在我們就能直接通過調用方法來控制視圖的可見性

image.png

并且,我們在Java中也可以調用在Kotlin中定義的擴展函數。
擴展函數的本質是靜態函數,它把調用對象當做它的第一個參數
所以,如果剛剛我們的View擴展函數定義在ViewUtils.kt文件中
那么,我們在Java文件中可以這樣調用

ViewUtilsKt.visiable(tbCommonRlSync)

2.可空性

可空性是Kotlin類型系統中幫助你避免NullPointException錯誤的特性。
Kotlin的變量類型包括可空類型和非空類型。可空類型在編譯期會檢查Null情況
Kotlin中提供多種運算符,幫助我們檢查可空類型變量的Null情況

  • 安全調用運算符?.
  • Elvis運算符?:
  • 安全轉換運算符as?
  • 非空斷言!!
  • let函數

3.代碼簡潔,可讀性強

例如:創建一個對象
Java中的寫法

image.png

在kotlin文件中

image.png

再例如:我們在定義按鈕點擊事件時通常的寫法是

Button button = (Button)findViewById(R.id.button)  
    button.setOnClickListener(new View.OnClickListener() {  
       @Override public void onClick(View v) {  
            Toast.makeText(this,”Click The Button",Toast.LENGTH_SHORT);  
     } 
 });  

而利用Kotlin+Extension+Anko可以簡化為

button.onClick{
       toast(“Click The Button”);
}

4.與Java的互操作性

Kotlin與Java能夠進行混合編程,在原有Java項目中使用Kotlin編程時,不需要將整個項目都轉成Kotlin。

(1)屬性讀寫
Kotlin可以自動識別Java中的getter/setter;在Java中可以過getter/setter操作Kotlin的屬性。

(2)關鍵字調用
Kotlin中定義的一些關鍵字是Java中沒有的,如果Java中使用這些關鍵字作為方法名,那么在Kotlin中調用時,要加入轉義字符。如is關鍵字:

image.png

(3)平臺類型
Java 中的任何引用都可能是null,這使得 Kotlin 對來自 Java 的對象要求嚴格空安全是不現實的。 Java 聲明的類型在 Kotlin 中會被特別對待并稱為平臺類型。對這種類型的空檢查會放寬, 因此它們的安全保證與在 Java 中相同。
當我們調用平臺類型變量的方法時,Kotlin 不會在編譯時報告可空性錯誤, 但在運行時調用可能會失敗,因為空指針異常或者 Kotlin 生成的阻止空值傳播的斷言:
平臺類型表示法
用助記符!來表示平臺類型,如:T!表示T 或者T?

(4)可變參數
Kotlin調用Java中含有可變參數的函數時,可以用展開運算符*
例如:在Java中定義方法

public void removeIndicesVarArg(int... indices)

在kotlin中調用就要用到展開運算符

javaObj.removeIndicesVarArg(*array) 

5.函數式編程

Kotlin支持面向對象和函數式兩種編程風格。
函數式編程的核心是

  • 頭等函數——把函數當作值來使用,可以用變量來保存它,把它當作參數傳遞,或者當作其他函數的返回值。
  • 不可變性——使用不可變對象,保證他們的狀態在創建之后不能再變化
  • 無副作用——使用的是純函數。此函數在輸入相同時會產生同樣的結果,并且不會修改其他對象的狀態,也不會與外面的世界交互。

二、學習歷程

1.技術背景

書籍

  • kotlin in action(1-2周)
    主要講解Kotlin的入門基礎,推薦指數五顆星
  • kotlin-for-android-developers-zh(2天)
    主要講解kotlin的實踐,對基礎知識沒有過多的講解,推薦指數四顆星
  • kotlin崛起:次世代Android開發(1天)
    主要看的是Anko Layout DSL部分,推薦指數三顆星
  • kotlin-reference-chinese (http://www.kotlincn.net/docs/reference/) (1天)
    kotlin的官方文檔,主要看的是java與kotlin的互操作性,推薦指數五顆星

2.遇到過的問題

(1) kotlin中使用Retrofit的通配符問題
Retrofit請求的時候,要先定義一個接口
在Java中 代碼可以正常執行

image.png

在kotlin中代碼不能正常執行

image.png

Retrofit在執行此方法時,會檢查參數的類型。雖然kotlin的Any類似于Java的Object,但是這里的會被編譯成通配符?。Retrofit檢查到類型為通配符,會報出異常,導致代碼不能正確的執行。

這時候我們可以添加@JvmSuppressWildcards注解
@JvmSuppressWildcards用來注解類和方法,使得被標記元素的泛型參數不會被編譯成通配符。這樣就可以保證代碼正常執行

image.png

(2)數據庫框架GreenDao,需要在實體類中添加注解生成對應的Dao類
但是這個框架并不支持Kotlin的實體類,所以在使用的時候,我們還是要將需要保存到數據庫的實體,以Java類的形式編寫。

(3)java調用Kotlin代碼時,可能會傳入一個空的變量,由于是平臺類型的變量在編譯的時候并不會報錯,但是在運行期間會直接奔潰。故我們在使用平臺類型的時候,要謹慎使用。

(4)kotlin與Databinding一起使用的話
需要在Gradle文件中添加如下配置

kapt {
    generateStubs = true
}
dependencies {
    kapt 'com.android.databinding:compiler:3.0.0'
}

三、Kotlin實踐

利用kotlin來編寫一個小demo
功能簡介

  • 利用kotlin來編寫一個小Demo,實現簡單的登錄功能和地區信息的增刪查改
  • 利用Anko Layout DSL來替代XML文件編寫界面
  • 使用Extension來訪問組件
  • 使用擴展函數作為工具類
  • rxJava+Retrofit作為網絡框架,GreenDao作為數據庫操作框架

1.登錄界面(Anko layout dsl)

編寫如圖一個登錄界面

image.png

用Anko Layout DSL來寫的話

image.png
  • 其中dip函數是Anko庫中將dip單位的值轉為像素單位的一個函數
  • onClick函數是Anko庫中對OnClickListener接口的一個擴展函數

2.區域列表界面

編寫如圖一個區域列表界面

image.png

用Anko Layout DSL來寫的話

image.png

Anko Layout DSL優缺點

  • 優點:
    1.相比于Java代碼編寫的界面,更加的簡潔。所有的組件都是Anko庫中定義的擴展函數,lambda表達式作為參數,可讀性強
    2.相比較與XML文件,這種編寫界面的方式更易于擴展,代碼易于重用
  • 缺點:
    1.現階段的Anko Layout Preview工具還不太成熟,預覽界面不能實時刷新。
    2.組件Id需要自己定義,通過Id獲取組件很麻煩,也沒辦法與Extension一起使用

下面看下Extension的使用

3.用Extension來訪問XML中的組件

先用XML編寫一個Dialog彈窗,如圖

image.png

XML文件如下

image.png

我們在Kotlin文件中,導入該布局

image.png

就能直接利用Id訪問組件

image.png

這樣我們就能擺脫大量的findViewById代碼

4.非空性

image.png
  • let函數 保證接收到的參數為空時,不執行任何操作

5.擴展函數

為Activity定義擴展函數,用于添加Fragment

image.png

在Activity中可以直接使用addFrg添加Fragment

image.png

6.函數式編程

image.png

這里將接口返回的List做適當的處理,用asSequence將數組轉換成序列的形式
filter函數主要是從集合中移除不想要的元素
map函數主要是 對集合中每一個元素應用給定的函數并把結果收集到一個新的集合
apply函數是把第一個參數轉換成第二個參數傳給它的lambda接收者,并返回作為實參傳遞給它的對象。
最后用toList函數將序列轉換為數組。

總結

  • Kotlin編程使我們的代碼變得更加簡潔,可讀性強,便于我們代碼的review
  • 可空性的處理極大的減少了我們代碼中NPE的風險
  • 擴展函數的存在,讓我們能夠方便的擴展API
  • kotlin與Java高度的互操作性使我們可以在原有的項目中輕松的使用Kotlin
  • Kotlin中大量的庫函數,極大的減少了我們的工具類
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容