本文標題:Android 開發者自述:爲何我要改用 Kotlin?
本文地址:https://www.oschina.net/news/84980/why-i-turn-to-kotlin
.
對於Kotlin,我一開始是有抵觸情緒的,以爲這門語言有點像Js,因此主觀地就斷定這個語言很差。後面來到新公司,大佬要求新寫的代碼必須使用Kotlin,因而慢慢喜歡上了這門語言。不少人在學習以前會問,Kotlin到底值不值得學?在這裏,咱們先不急着回答這個問題,先來看看Kotlin之於Java到底有哪些不同的地方。java
相信不少開發人員,尤爲是 Android 開發者都會或多或少據說過 Kotlin,固然若是沒有聽過或者不熟悉也沒有關係。由於本篇文章以及博客後期的內容會涉及到不少關於 Kotlin 的知識分享。android
在寫這篇文章前的一個多月,Flipboard 中國的 Android 項目肯定了正式將 Kotlin 做爲項目開發語言,這就意味着新增的代碼文件將以 Kotlin 代碼格式出現,並且同時舊的 Java 代碼也將會陸陸續續翻譯成 Kotlin 代碼。在使用 Kotlin 的這段時間,被它的簡潔,高效,快捷等等特色震撼,因此有必要寫一篇文章來談一談 Kotlin 的特性,如若能取得推廣 Kotlin 的效果則倍感欣慰。web
來自知名的工具開發商 JetBrains,也就決定了 Kotlin 的基因中必然包含實用與高效等特徵。那咱們接下來看一看 Kotlin 的特色,固然這也是我改用 Kotlin 的重要緣由。編程
1,Kotlin 支持類型推斷,沒有 Java 那樣的囉嗦。
2,另外用 var 表示變量,val 表示常量更加的簡潔
3,方法也很簡單,連 function 都縮寫成了 fun,平添了幾分雙關之意。
4,類的繼承和實現很簡單,使用:便可
5,Kotlin 每一個句子都不須要加分號 (;)api
空指針(NullPointerException 或 NPE)是咱們使用 Java 開發程序中最多見的崩潰了。由於在 Java 中咱們不得不寫不少防護性的代碼,好比這樣:
數組
在 Kotlin 中空指針異常獲得了很好的解決。安全
以下面的代碼就是 Kotlin 實現空指針安全的一個例子,並且相對 Java 實現而言,簡直是一行代碼搞定的。
app
不少時候,Framework 提供給咱們的 API 每每都時比較原子的,調用時須要咱們進行組合處理,由於就會產生了一些 Util 類,一個簡單的例子,咱們想要更快捷的展現 Toast 信息,在 Java 中咱們能夠這樣作。
框架
可是 Kotlin 的實現卻讓人驚奇,咱們只須要重寫擴展方法就能夠了,好比這個 longToast 方法擴展到全部的 Context 對象中,若是不去追根溯源,可能沒法區分是 Framework 提供的仍是自行擴展的。
編程語言
注意:Kotlin 的方法擴展並非真正修改了對應的類文件,而是在編譯器和 IDE 方面作得處理。使咱們看起來像是擴展了方法。
Kotlin不只在對null類型有很好的處理,在其餘不少方面也有不少優點。
接下來來看看kotlin-android-extensions這個插件,說的簡單點,這個插件可以代替android裏面的findViewById操做,經過這個插件,咱們能夠直接在Activity,Fragment和View中直接經過xml裏面的id來找到view對象,不再須要使用findViewById這樣重複的代碼來初始化View對象了。雖然android提供了DataBinding機制來方便開發者來初始化View對象,可是DataBinding在apk打包的時候常常報錯,相比Kotlin這點,就沒有這個問題,並且使用起來更簡潔,基本不須要在代碼中作任何初始化操做。另外,ButterKnife這類開源控件雖然也能省略findViewById的操做
所謂的 Lambda 表達式是匿名函數,這使得咱們的代碼會更加的簡單。好比下面的代碼就是 lambda 的應用。
java監聽View的回調以下:
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
.....
}
});
複製代碼
mView.setOnClickListener {
......
}
複製代碼
所謂的高階函數就是:能夠接受函數做爲參數,也能夠返回函數做爲結果
舉一個接受函數做爲參數的例子。在 Android 開發中,咱們常用 SharedPreference 來存儲數據,若是忘記調用 apply 或者 commit 則數據修改不能應用。利用 Kotlin 中的高階函數的功能,咱們能更好的解決這個問題:
Kotlin 支持了 Streams API 和方法引用,這樣函數式編程更加方便。
al currentFilter =
mFilterList.filter { it is SearchResultFilter }
.map { it as SearchResultFilter }
.find { it.id == "1" }
複製代碼
上面展現的是使用Kotlin中函數式API找到集合中對象類型是SearchResultFilter而且它的id是1的元素。看到這段代碼有沒有以爲不同,若是咱們用java的話確定是要使用for循環的,可是使用Kotlin中的filter和map這類的函數卻可以讓咱們在某些時候處理集合的時候更容易,並且也讓咱們的代碼可讀性更好。
簡單說下filter和map函數的做用,filter可以幫咱們過濾出知足條件的元素,可是filter並不會改變這些元素,而map能夠改變這些元素,map可以將原來的集合按照給定的操做轉換後映射到一個新的集合中去。
Kotlin類型的函數還有find,groupBy,flatMap和flatten等等。這裏就不一一介紹了。另外,這種函數配合RxJava食用更佳,相信結合RxJava來寫代碼你會發覺寫出優雅地代碼並非想象的那麼難。
不管是 Java 仍是 Android 開發,咱們都會用到字符串拼接,好比進行日誌輸出等等。在 Kotlin 中,字符串模板是支持的,咱們能夠很輕鬆的完成一個字符串數組的組成:
Kotlin 和 Java 都屬於基於 JVM 的編程語言。Kotlin 和 Java 的交互性很好,能夠說是無縫鏈接。這表如今: