快速上車Kotlin
presentation by hzwusibo 20180927
分享主要分4部分:
前言: Kotlin的優勢
1、Kotlin在Android中案例學習(新特性 )
2、Java切換Kotlin 小卡片(語法對比,快速入門)
3、Kotlin基礎語法學習(demo樣例)
4、小結與討論
補充
參考資料
前言
Kotlin優勢:
可以編寫少得多的程式碼。
更安全: Kotlin是空安全的,在編譯期就處理了各種null的情況,避免了執行時異常。可以節約除錯空指標異常的時間,不用擔心 null引發bug。
可擴充套件函式 :這意味著,就算我們沒有許可權去訪問這個類中的程式碼,我們也可以擴充套件這個類的更多的特性。
函式式的 :Kotlin是基於面向物件的語言。但是就如其他很多現代的語言那樣,它使用了很多函數語言程式設計的概念,比如,使用lambda表示式來更方便地解決問題。
高度互操作性的 :你可以繼續使用所有用Java寫的程式碼和庫,甚至可以在一個專案中使用Kotlin和Java兩種語言混合程式設計。一行Java一行Kotlin。
一、Kotlin 用於 Android 的案例學習
1.1 Android Studio 快速上手小工具:
如果不知道如何在Kotlin中寫一個相當簡單的Java表示式。 有一個簡單的訣竅,就是在AndroidStudio的Java檔案中編寫一段程式碼,然後將其貼上到kt檔案中,它會自動轉換為Kotlin。
1、直接把Java程式碼拷貝到.kt檔案中,編譯器會彈出如下提示:

Kotlin與Java是100%相容的,因為它最終會編譯成Java位元組碼,我們可以通過 Android Studio工具看到編譯的bytecode:

我們還可以把編譯出來的Java位元組碼反編譯成Java程式碼。

1.2 Kotlin 用於 Android 的案例學習
Kotlin 已被一些大公司成功採用,其中一些公司分享了他們的經驗:
Pinterest 已經成功地將 Kotlin 引入了他們的應用程式中,每個月有 1 億 5 千萬人使用。 Basecamp 的 Android 應用程式
ofollow,noindex">https://www.youtube.com/watch?v=X1RVYt2QKQE
1、 資料類 koltin轉Java copy(val var 不必說明型別、 == === )
2、沒有set get 變成 屬性
3、函式 (可以引數 預設值、 一行的函式 return —> = 、when )
4、拓展函式
5、null ? !! ?:
6、高階 函式 (函式作為引數)
7、類繼承 (open)
1.3 新特性
3.1、 資料類 (可以編寫少得多的程式碼)
資料類是kotiln的一個語法糖, 編譯器會自動為資料類生成一些成員函式
java:

kotlin:

3.2、 所有型別都能 val var表示
所有的物件都通過一個指標所持有,而指標只有兩種型別:var 表示指標可變,val表示指標不可變。

Kotlin還引入了字串模板 $ ,可以在字串中直接訪問變數和使用表示式

3.3 冒號
下面四種場景:
在變數定義中,代表變數的型別
在類定義中,代表基類的型別
在函式定義中,代表函式返回值的型別
在匿名物件中,代表物件的型別

3.4 Lambdas
RxJava現在很火,RxJava在android中的應用:

函式縮寫:返回一個單一的的值 (省略大括號, 直接 = )

3.5、 強大的when
Kotlin中沒有switch操作符,而是使用when語句來替代。同樣的,when 將它的引數和所有的分支條件順序比較,直到某個分支滿足條件。如果其他分支都不滿足條件將會進入 else 分支。

但功能上when語句要強大得多。首先第一點是,我們可以用任意表達式(而不只是常量)作為分支條件,這點switch就做不到。
如下述程式碼,前面三個分支條件分別是:1、變數在[1, 10]區間內, 2、變數x不在[10, 20]區間內,3、變數x是一個字串。這個表示式用switch語句基本無法實現,只能用if else 鏈來實現。

if else 鏈,我們可以直接用when語句把它給替換掉:


3.6 物件比較
Java的 == 操作符是比較引用值,但Kotlin 的 == 操作符是比較內容, === 才是比較引用值。
‘==‘表示比較值 (相當於java equal) !=
‘===‘表示比較兩個物件的地址是否相等(相當於java == ) !==
基於這點,我們可以寫出邏輯更簡潔合理的程式碼:

上述程式碼可以直接用when語句實現

3.7、擴充套件方法
這意味著,就算我們沒有許可權去訪問這個類中的程式碼,我們也可以擴充套件這個類的更多的特性。
3.7.1 dp, sp, px間的轉換
傳統的java寫法通常是寫個類似Util.dpToPx(int value)這樣的方法。看看Kotlin是怎麼通過類的拓展來優雅的解決的:

然後就可以這樣寫了:params.topMargin = 16.dpToPx()
是不是感動到哭:sob:
3.7.2 View的動畫
每次寫Animation都是一個頭兩個大, 這回我們不看java了,直接上Kotlin程式碼:

duration還貼心的設了個預設值呢!然後就可以這樣寫了~yourView.animateTopMargin(16, 32)或者你想把duration設長一點 yourView.animateTopMargin(16, 32, 500)
3.7.3 讓Fresco更易用
Fresco是Facebook出品的網路圖片載入庫,實現了許多在android上非常有用的功能。比如Multi-URI功能可以優先顯示低解析度的圖片,等高解析度的圖片下載完成後再進行替換。這個功能在移動裝置上太太太有用了,就是寫起來有點蛋疼:

怎麼使用就不寫了,大家都知道了
3.8、更加安全的指標操作
Kotlin是空安全的,在編譯期就處理了各種null的情況,避免了執行時異常。可以節約除錯空指標異常的時間,不用擔心 null引發bug。

?: 表示左側不為空, 返回左側 。 b?.length 不為null 返回左側,否則返回右側
? 表示變數可為空

3.9 高階函式(函式作為引數,傳入函式)
高階函式簡單的說就是 一個函式作為方法的引數
findEmail 在users中篩選 email符合 傳入 predicate函式的user,並返回。

傳入函式fit到 findEmail方法 ( 需要在函式名前加兩個冒號 :: 作為標記)

附上:

3.10 資料解構
解構就是解除資料結構, 這裡的結構就是將資料物件中的屬性提取出來
val (id , username, email) = User(1, "WUSIBO" ,"[email protected]")
Log.w("WSB", "username = "+username);
3.11 更簡潔的字串
字串的所見即所得 , 三引號”””來方便長篇字串的書寫

3.12 委託
可觀察屬性,本質就是觀察者模式,在Java中也可以實現這個設計模式,但Kotlin實現觀察者模式不需要樣板程式碼。在談Kotlin的可觀察屬性前,先看下Kotlin裡面的委託。同樣的,委託也是一種設計模式,它的結構如下圖所示:

Kotlin在語言級別支援它,不需要任何樣板程式碼。Kotlin可以使用by關鍵字把子類的所有公有成員都委託給指定物件來實現基類的介面:


上述程式碼中,Base是一個介面,BaseImpl是它的一個實現類,通過by b語句就可以把Derived類中的所有公有成員全部委託給b物件來實現。我們在建立Derived類時,在構造器中直接傳入一個BaseImpl的例項,那麼呼叫Derived的方法等同於呼叫BaseImpl的例項的方法,訪問Derived的屬性也等同於訪問BaseImpl的例項的屬性。
回到可觀察屬性這個概念,Kotlin通過 Delegates.observable()實現可觀察屬性:

上述程式碼中,name是一個屬性,改變它的值都會自動回撥{ prop, old, new -> }這個lambda表示式。簡單來說,我們可以監聽name這個屬性的變化。
可觀察屬性有什麼用處呢?ListView中有一個經典的Crash:在資料長度與Adapter中的Cell的長度不一致時,會報IllegalStateException異常。這個異常的根本原因是修改了資料之後,沒有呼叫notifyDataSetChanged,導致ListView沒有及時重新整理。如果我們把資料做成可觀察屬性,在觀察回撥方法中直接重新整理ListView,可以杜絕這個問題。

二、小卡片 (From Java to Kotlin )
2.1 常量與變數

2.2 null宣告

2.3 空判斷

2.4 字串拼接

2.5 換行

2.6 三元表示式

2.7 操作符

2.8 型別判斷和轉換 (宣告式)

2.9 型別判斷和轉換 (隱式)

2.10 if 多重條件

2.11 case語句

2.12 for迴圈

2.13 集合操作

2.14 遍歷

2.19 方法定義

2.20 帶返回值的方法

2.21 無結束符號

2.22 工具類

2. 23 Get Set


2.24 類擴充套件方法

其他 :
快速上手 Kotlin 的 11 招 : https://mp.weixin.qq.com/s/lDBSi2E5_u8dJg21wubH4Q?utm_source=androidweekly.io&utm_medium=website
三、Koltin基礎語法 demo
koltin 樣例
1、koltin 基礎知識
2、類與介面
3、資料類
4、泛型
5、 koltin 高階函式與Lambda表示式
6、其他
7、委託
git: https://g.hz.netease.com/WM-Android/WM-Android-Demo/koltinDemo
快速查詢: 可以見目錄

四、小結
Kotlin 非常適合開發 Android 應用程式,將現代語言的所有優勢帶入 Android 平臺而不會引入 任何新的限制:
相容性:Kotlin 與 java 完全相容,保障了 Kotlin 應用程式可以在較舊的 Android 裝置 上執行而無任何問題。Kotlin 工具在 Android Studio 中會完全支援,並且相容 Android 構 建系統。
效能:由於非常相似的位元組碼結構,Kotlin 應用程式的執行速度與 Java 類似。 隨著 Kotlin 對行內函數的支援,使用 lambda 表示式的程式碼通常比用 Java 寫的程式碼執行得更 快。
互操作性:Kotlin 可與 Java 進行 100% 的互操作,允許在 Kotlin 應用程式中使用所有現 有的 Android 庫 。這包括註解處理,所以資料繫結和 Dagger 也是一樣。
佔用:Kotlin 具有非常緊湊的執行時庫,可以通過使用 ProGuard 進一步減少。 在實際 應用程式中,Kotlin 執行時只增加幾百個方法以及 .apk 檔案不到 100K 大小。 編譯時長:Kotlin 支援高效的增量編譯,所以對於清理構建會有額外的開銷,增量構建通 常與 Java 一樣快或者更快。
學習曲線:對於 Java 開發人員,Kotlin 入門很容易。包含在 Kotlin 外掛中的自動 Java 到 Kotlin 的轉換器有助於邁出第一步。Kotlin 心印 通過一系列互動練習提供了語言主要 功能的指南。
五、討論
17 位谷歌 Android 開發專家是如何看待 Kotlin 的?
https://mp.weixin.qq.com/s/T7GZCuauE3Y0dAbZd_oLPw
補充:
1、Android studio3.0 kotlin執行main方法錯誤
https://blog.csdn.net/yangzongbin/article/details/78394621
2、是 100% Kotlin 程式碼,他們報告了程式設計師幸福的巨大差 異,以及工作質量和速度的巨大改善。
https://m.signalvnoise.com/how-we-made-basecamp-3s-android-app-100-kotlin-35e4e1c0ef12
3、Keepsafe 的 App Lock 應用程式也已轉換為 100% Kotlin, 使原始碼行數減少 30%、方 法數減少 10%。
https://medium.com/keepsafe-engineering/lessons-from-converting-an-app-to-100-kotlin-68984a05dcb6
參考資料:
1、from-java-to-kotlin https://github.com/MindorksOpenSource/from-java-to-kotlin/blob/master/README-ZH.md
2、Kotlin在Android中的應用 http://qq157755587.github.io/2015/11/14/kotlin-in-android/?utm_source=androidweekly.io&utm_medium=website
3、Kotlin —— 這次入門就不用放棄了 https://www.jianshu.com/p/f364e3f9cc36
4、Kotlin超棒的語言特性 https://mp.weixin.qq.com/s/ylAZnOObrwtJDPqaK2ONLw
5、Kotlin —— 這次入門就不用放棄了https://www.jianshu.com/p/f364e3f9cc36