1. 程式人生 > >Kotlin學習之旅(D1)-學習計劃&基本語法

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.學習金字塔法則,被動學習和主動學習的知識留存率是差很多的:

3391dd8c4e9aac9e.jpg

儘量做創造性(輸出)的事情,例如寫總結,做筆記,敲程式碼,甚至內部分享,寫成教程等

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 的學習到此就結束啦。