1. 程式人生 > 其它 >Kotlin基礎

Kotlin基礎

1.kotlin的簡介

Kotlin是由JetBrains開發的針對JVM、Android和瀏覽器的靜態程式語言,目前,在Apache組織的許可下已經開源。使用Kotlin,開發者可以很方便地開發移動Android應用、伺服器程式和JavaScript程式。Kotlin可以將程式碼編譯成Java位元組碼,也可以編譯成JavaScript,方便在沒有JVM的裝置上執行。

Kotlin來源於一個島嶼的名字,全稱是Kotlin Island,是英語【科特林島】之意,這個小島位於俄羅斯的聖彼得堡附近。之所以要命名為Kotlin,是因為Kotlin的主要開發工作就是由位於聖彼得堡分公司團隊完成的。

2.kotlin的基礎語法

函式定義

函式定義使用關鍵字fun,引數格式為: 引數:型別

fun sum2(x: Int, y: Int): Int {
    return x + y;
}

表示式作為函式體,返回值型別自動推斷

fun sum(x: Int, y: Int) = x + y;

public 方法必須明確返回值型別,否則會報錯

public fun sum3(x: Int, y: Int): Int = x + y;

無返回值的函式(Unit類似於java中的void,但是不等同於void)

fun sum4(x: Int, y: Int): Unit {
    println(x + y)
}
可變長引數函式

函式的變長引數可以用 vararg 關鍵字進行標識, 此時引數是以陣列的形式展示

// 列印引數
fun vararg(vararg variable: String) {
    for (vars in variable) {
        println(vars)
    }
}
lamdba表示式
val list: MutableList<String> = ArrayList()
list.add("a")
list.add("b")
list.add("c")
list.add("d")
list.forEach(
    Consumer { l: String ->
        println(l)
    }
)
定義常量和變數

可變變數定義: 使用var關鍵字

var 識別符號:型別=初始化值

不可以變數定義: 使用val關鍵字

val 識別符號:型別=初始化值

常量和變數都可以沒有初始值,但是在引用前必須初始化
編譯器支援自動型別判斷,即宣告時可以不指定型別,由編譯器判斷

/**
 * @定義常量和變數
 *   可變變數定義:    使用var關鍵字
 *   不可以變數定義:   使用val關鍵字
 *   var 識別符號:型別=初始化值
 *   val 識別符號:型別=初始化值
 *
 * 常量和變數都可以沒有初始值,但是在引用前必須初始化
 * 編譯器支援自動型別判斷,即宣告時可以不指定型別,由編譯器判斷
 */

var a: Int = 1
var b = 1
println(a)
println(b)//系統會自動推斷變數型別為Int
val c: Int// 初始化時候必須提供變數型別
c = 2// 明確賦值
println(c)
var x = 5
x += 2 // 變數是可以被修改
println(x)
字串模板

$ 表示一個變數名或者變數值
$varName表示變數值
$(varName.fun())表示變數的方法返回值

/**
 * @字串模板
 * $ 表示一個變數名或者變數值
 * $varName表示變數值
 * $(varName.fun())表示變數的方法返回值
 */

// 1.$varName表示變數值
var s = "wangliang";
var s1 = "i am $s";
println(s1) // 打印出 i am wangliang
// 2.$(varName.fun())表示變數的方法返回值
var s2 = "i  am ${s.replace("wangliang", "wl")}";
println(s2)
Null檢查機制

Kotlin的空安全設計對於宣告可為空的引數,在使用時要進行空判斷處理,有兩種處理方式:
1.欄位後加!!像Java一樣丟擲空異常
2.另一種欄位後加?可不做處理返回值為 null或配合?:做空判斷處理

    /**
     * @Null檢查機制
     * Kotlin的空安全設計對於宣告可為空的引數,在使用時要進行空判斷處理,有兩種處理方式:
     *      1.欄位後加!!像Java一樣丟擲空異常
     *      2.另一種欄位後加?可不做處理返回值為 null或配合?:做空判斷處理
     */

    // 型別後面加?表示可以為空
    var age: String? = null
    // 丟擲空指標異常
//    var ages=age!!.toInt()
//    // 不作處理 返回null
//    val ages1=ages?.toInt()
    // age為空返回-1
    val ages2 = age?.toInt() ?: -1
    println(ages2)
型別檢測及自動型別轉換
/**
 * @型別檢測以及自動型別的轉換
 * 我們可以使用 is 運算子檢測一個表示式是否某型別的一個例項(類似於Java中的instanceof關鍵字)。
 */
fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        return obj.length;
    }
    return null;
}
區間
/**
 * @區間
 * 1.區間表示式由具有操作符形式 .. 的 rangeTo 函式輔以 in 和 !in 形成。
 * 2.區間是為任何可比較型別定義的,但對於整型原生型別,它有一個優化的實現。
 */

// 輸出 "1234"
for (i in 1..4) print(i)
println()
// 什麼都不輸出
for (i in 4..1) print(i)
println()
// 輸出 "4321"
for (i in 4 downTo 1) print(i)
println()
// if 和區間的配合使用
val i=4;
val l=3;
if (i in l..10){ // 等同於 i>=l && i<=10
    println(i)
}
// 使用 step 指定步長
for (i in 1..4 step 2) print(i) // 輸出 "13"
println()
for(i in 4 downTo 1 step 2) print(i) // 輸出 "42"
println()
for(i in 1 until  10) print(i) // 列印除了10
println()