Kotlin學習之旅(D1)-學習計劃&基本語法
2017年的Google I/O 開發者大會
Kotlin正式成為了Android的官方支援語言
2018年的國慶小長假最後一天
BlueLzy正式開始Kotlin學習之旅
學習計劃
學什麼?
今天是Kotlin學習之旅的第一天,這次Kotlin之旅的行程計劃是21天
目的:
每天只要花30分鐘-1個小時,堅持21天,掌握Kotlin開發Android專案所需知識
包括:
-
基礎語法(2D)
-
高階語法(3D)
-
Kotlin Idioms(2D)
-
From Java to Kotlin(2D)
-
Kotlin Android Extensions(2D)
-
Unit Test with Kotlin(2D)
-
使用Kotlin完成一個Android小專案(7D)
-
總結(1D)
不包括:
- Kotlin對比Java的好處,為什麼要學習Kotlin
- 怎麼安裝Android Studio / IDEA
- 怎麼加入Kotlin依賴
- …
需要的前置技能:任意一種程式語言基礎,基本資料型別,操作符等基礎知識已掌握即可
怎麼學?
1.根據20/80法則,我們不需要掌握Kotlin所有的知識點,只需要掌握20%最常用就足以應付80%的場景了
2.學習金字塔法則,被動學習和主動學習的知識留存率是差很多的:
儘量做創造性(輸出)的事情,例如寫總結,做筆記,敲程式碼,甚至內部分享,寫成教程等
3.Learning By Doing法則,整個Kotlin學習之旅主要分為兩個部分
-
實踐部分:使用Kotlin編寫一個Todo專案,選擇這個專案的原因是:無網路請求,方便編寫Unit Test,專案結構較為簡單,7天即可完成
程式設計最重要就是動手敲,最終要的是能執行的程式,因此建議大家都跟著動手敲一遍
基本語法(Part Ⅰ)
變數
在Java裡面,定義 常量 的寫法是加上final關鍵字
而在Kotlin裡面,定義常量的關鍵字是:val
val a: Int = 0 // 相當於java裡面的 private static final int a = 0;
val b = 2 // 省略Int型別,在kotlin中也是允許的,Kotlin可以自動推斷變數的型別
那麼要定義 變數
通過關鍵字:var
var c = 0 // 省略Int型別
c += 1
Tips:在kotlin中,我們可以省略每行程式碼最後的分號 ’ ; ’
延遲初始化 - Late-Initialized:
由於在Kotlin裡面變數是non-null的,但是有些時候我們需要在執行完某個操作後再賦值,那麼就需要用到延遲初始化,通過 lateinit 關鍵字來實現
class Address {
var name: String = ...
var street: String = ...
lateinit var city = ...
}
// 通過isInitialized來檢查變數是否已經被初始化
if (address::city.isInitialized) {
println(address.city)
}
函式
通過 fun 關鍵字來定義函式,例如:
fun nothing(){
println("i am an empty function")
}
有參函式:
fun sum(a: Int, b: Int): Int {
return a + b
}
這裡我們傳入a,b兩個Int引數,返回值也是Int型別
a: Int - 引數名: 引數型別
fun(): Int - 函式: 函式返回值型別
更簡潔的寫法:
fun sum(a: Int, b: Int) = a + b
通過 ‘’=’’ 來表示 return 語句,注意:返回值只有一條表示式的時候才適用
引數有預設值的函式:
fun sum(a: Int = 1, b: Int = 1) {...}
此時a,b的預設值都是1
註釋
// 單行註釋
/* 這是一個多行註釋
這是一個多行註釋 */
String字串模板
使用 $var_name 來表示變數的值
var a = 1
val s1 = "a is $a"
a = 2
val s2 = "${s1.replace("is","was")}, but now is $a"
println(s2)
這段程式碼的輸出結果為:
a was 1, but now is 2
s1 的初始值為: a is 1,然後通過.replace()函式,把 is 替換為 was ,此時 s1變成了 a was 1
條件語句
條件語句的判斷通常是 if 語句
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
更簡潔的寫法,記得上面我們說過的 “=” 來替換 return 嗎:
fun maxOf(a: Int, b: Int) = if(a > b) a else b
這裡其實使用了if 不加括號只執行一行的特性,常規寫法應該是這樣的:
fun maxOf(a: Int, b: Int) = if (a > b){
a
} else {
b
}
但是這樣實在是太難看了,所以就省略了大括號,把返回結果直接寫在一行程式碼裡
可空型別和null檢查
Kotlin具有空安全(null safety)特性,但是有時候我們就是想要返回null,該怎麼辦呢?
當str不存在整數時返回null:
fun parseInt(str: String): Int? {
// ...
}
官方文件給出的Sample:
fun parseInt(str: String): Int? {
return str.toIntOrNull()
}
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// ...
if (x == null) {
println("Wrong number format in arg1: '$arg1'")
return
}
if (y == null) {
println("Wrong number format in arg2: '$arg2'")
return
}
// x and y are automatically cast to non-nullable after null check
println(x * y)
}
fun main(args: Array<String>) {
printProduct("6", "7")
printProduct("a", "7")
printProduct("99", "b")
}
輸出結果為:
42
Wrong number format in arg1: 'a'
Wrong number format in arg2: 'b'
分析一下:
printProduct(“6”, “7”):x,y都能轉成Int型別,因此x,y都不是null,println(x * y) = 6 x 7 = 42
printProduct(“a”, “7”):x為"a"不能轉成Int,因此x為null,執行
println("Wrong number format in arg1: '$arg1'")
printProduct(“99”, “b”) :同上
說明在fun或者var 加上 “?” 就表示該型別可以為null,後面就需要進行是否為null的判斷
型別檢查與強制型別轉換
Kotlin中,“is” 是型別檢查的關鍵字
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` is automatically cast to `String` in this branch
return obj.length
}
// `obj` is still of type `Any` outside of the type-checked branch
return null
}
在這裡,執行 obj.length 的時候,obj 會強制型別轉換為 String
又或者可以這樣寫
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null
// `obj` is automatically cast to `String` in this branch
return obj.length
}
這兩段程式碼的意思都是一樣的,通過 is 或者 !is 進行型別檢查
使用 “as?” 進行“安全的”型別轉換
例如: null 不能轉換為String,因為String 是不可為null的,那麼這個時候我們可以用這種方式:
val x: String? = y as? String
當y為null的時候,結果會返回null,而不會丟擲異常
總結
今天是Kotlin學習之旅的第一天,主要學習了Kotlin的基礎語法,包括:
- 變數
- 函式
- String字串模板
- 條件語句
- 可空型別和null檢查
- 型別檢查與強制型別轉換
明天會學習剩下的基礎語法,包括:
- for迴圈和while迴圈
- when表示式
- 遍歷集合
面向物件程式設計打算在高階語法裡面學習,因為這一塊的知識點比較多,需要花的時間精力也會多一些。
好了,那麼Day 1 的學習到此就結束啦。