1. 程式人生 > >Kotlin基礎語法學習筆記

Kotlin基礎語法學習筆記

Kotlin簡介

Kotlin是一門與Swift類似的靜態型別JVM語言,由JetBrains設計開發並開源。與Java相比,Kotlin的語法更簡潔、更具表達性,而且提供了更多的特性,比如,高階函式、操作符過載、字串模板。它與Java高度可互操作,可以同時用在一個專案中。

Kotlin官方文件下載地址

Kotlin語法

1、函式的使用

定義函式使用fun關鍵字,如下程式碼所示:
fun add(a: Int, b: Int): Int {
    return a + b
}
函式add有兩個Int型的引數,冒號後跟的是函式的返回值,一條程式碼語句的末尾不用加分號,當然加上分號也沒有問題。 上面的add函式還可以簡寫成如下形式:
fun add(a: Int, b: Int) = a + b;
沒有顯式指定函式的返回值,會自動推斷函式的返回值。 如果一個函式沒有返回值,可以寫成如下兩種形式:
//沒有返回值的函式,顯式指定Unit為返回值
fun showAddResult(a: Int, b: Int): Unit {
    println(a + b)
}

//沒有返回值的函式,省略Unit的寫法
fun showAddResult2(a: Int, b: Int) {
    println(a + b)
}

2、常量和變數

使用val關鍵字宣告一個常量(只讀,不可修改),使用var關鍵字宣告一個變數,下面是具體用法:
fun test() {
    //使用val關鍵字宣告一個常量(只讀),宣告常量時必須初始化
    val a: Int = 1 //顯式指定常量的型別
    val b = 2  //自動推斷型別
    val c: Int //宣告一個不初始化的常量,必須顯式指定型別
//    b = 3  //常量值不可修改,這句程式碼會報錯

    //a = 3  //不可以修改常量的值,此句程式碼會報錯

    //使用var關鍵字宣告一個變數,變數的值可以修改
    var year: Int = 2016 //顯式指定變數的型別
    var month = 5 //自動推斷變數型別
    var day: Int //宣告一個不初始化的變數,必須顯式指定型別
    month = 6 //變數值可以被修改
}

3、註釋

Kotlin中的註釋和Java中類似,如下所示:
fun comments() {
//    註釋一行程式碼
//    var s = "hello world"
    /*註釋一段程式碼
    var a = 8
    a++
    a--*/
}
和Java不同的是,Kotlin中的註釋可以巢狀。

4、字串模板

//字串模板的用法
fun stringTempl(args: Array<String>) {
    if(args.size > 0)
        println("args[0] = ${args[0]}")
}

//main方法是整個程式的入口
fun main(args: Array<String>){
    var arr = arrayOf("hello", "world")
    stringTempl(arr)
}
上面的程式碼執行後,在控制檯列印如下內容:

5、條件表示式

常規的條件表示式可以是這麼寫的:
//常規寫法的條件表示式,這裡的函式返回值不能省略
fun max(a: Int, b: Int): Int {
    if(a > b)
        return a
    else
        return b
}
Kotlin可以簡寫條件表示式,如下所示:
//簡寫的條件表示式
fun max2(a: Int, b: Int) = if(a > b) a else b

6、可空型別

fun nullableTest() {
    //在變數型別後面加上問號,代表該變數是可空變數
    var name: String? = "zhangsan"
    name = null //可以將null賦值給name變數
    var person: String = "tom"
//    person = null  //這句程式碼會報錯,不可以將null賦值給一個不可空變數
}
函式返回值為可空的例子如下程式碼:
/*
函式返回值為Int?,表示返回值可為空
當引數為空或者為""時,則返回null,否則使用Java中的字串轉整型的方法
這裡也體現了kotlin程式碼和Java程式碼無縫整合
 */
fun parseInt(s: String): Int? {
    if(s == null || s == "")
        return null;
    return Integer.parseInt(s);
}

7、型別檢查和自動型別轉換

Kotlin中使用is運算子來檢查資料型別和做型別轉換,如下程式碼所示:
/*
當函式引數為字串型別時,就返回字串的長度,否則返回空
 */
fun getStringLength(n: Any): Int? {
    if(n is String)
        return n.length //這裡會自動將n轉化為字串型別
    return null
}
上面的程式碼還可以寫成:
/*
當函式引數為字串型別時,就返回字串的長度,否則返回空
 */
fun getStringLength(n: Any): Int? {
    if(n !is String)
        return null
    return n.length //這裡會自動將n轉化為字串型別
}

8、for迴圈和while迴圈

//for迴圈的測試程式碼
fun testFor() {
    var arr = arrayOf(1, 3, 4, 5, 6)
    for(i in arr.indices) { //通過索引迴圈
        println(arr[i])
    }
    for(num in arr) { //直接使用陣列中的物件迴圈
        println(num)
    }
}

//while迴圈的測試程式碼
fun testWhile() {
    var i = 0;
    while(i < 10) {
        print(" " + i)
        i++
    }
}

9、when表示式

when表示式就類似於Java中的switch表示式,如下程式碼所示:
fun main(args: Array<String>) {
    testCase("hello world")
}

fun testCase(obj: Any) {
    when(obj) {
        is String -> {
            print("this is string")
        }
        is Int -> {
            print("this is integer")
        }
        else -> {
            print("unkown value")
        }
    }
}

10、ranges的使用

(1)使用in操作符檢查一個數是否在某個範圍內

/*
判斷分數是否大於等於90,小於等於100
 */
fun isGood(score: Int) {
    if(score in 90..100) //ranges是閉區間
        println("very good")
    else
        println("not so good")
}

(2)檢查索引是否越界

/*
檢查index是否在陣列arr的索引範圍內
 */
fun checkIndex(index: Int, arr: Array<Int>) {
    if(index in 0..arr.lastIndex) //arr.lastIndex返回的是陣列的最後一位的下標
        println("index in bounds")
    else
        println("index out of bounds")
}

(3)遍歷一個範圍

for(i in 1..5) {
    println(i)
}
也可以通過in運算子遍歷一個集合,如下程式碼:
//in運算子遍歷一個字串陣列
fun testStr(arr: Array<String>) {
    for(str in arr)
        println(str)
}