Kotlin 基本語法

帶你快速入門,讀懂Kotlin基本語法~

基本語法

定義包

包應(yīng)該在源文件的頭部聲明:

package my.demo

import java.util.*

// ...

不需要匹配目錄和包:源文件可以任意放在文件系統(tǒng)中般妙。

查看 Packages.

定義函數(shù)

有兩個 Int 參數(shù) 和 Int 返回值的函數(shù)定義:

//sampleStart
fun sum(a: Int, b: Int): Int {
    return a + b
}
//sampleEnd

fun main(args: Array<String>) {
    print("sum of 3 and 5 is ")
    println(sum(3, 5))
}

表達(dá)式作為函數(shù)體化戳,返回類型為推斷所得的函數(shù):

//sampleStart
fun sum(a: Int, b: Int) = a + b
//sampleEnd

fun main(args: Array<String>) {
    println("sum of 19 and 23 is ${sum(19, 23)}")
}

返回?zé)o意義值的函數(shù):

//sampleStart
fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
//sampleEnd

fun main(args: Array<String>) {
    printSum(-1, 8)
}

Unit 返回類型可以被忽略不寫 :

//sampleStart
fun printSum(a: Int, b: Int) {
    println("sum of $a and $b is ${a + b}")
}
//sampleEnd

fun main(args: Array<String>) {
    printSum(-1, 8)
}

查看 Functions.

定義局部變量

一次分配(只讀)的局部變量:

fun main(args: Array<String>) {
//sampleStart
    val a: Int = 1  // 立即賦值
    val b = 2   // `Int` 類型是推斷得出ed
    val c: Int  // 沒有初始化時(shí)需要指明類型
    c = 3       // 之后賦值
//sampleEnd
    println("a = $a, b = $b, c = $c")
}

可變變量:

fun main(args: Array<String>) {
//sampleStart
    var x = 5 // `Int` 類型是推斷的
    x += 1
//sampleEnd
    println("x = $x")
}

查看 Properties And Fields.

注釋

和 Java 與 JavaScript 類似,Kotlin 支持 行注釋 和 塊注釋茧泪。

// 這是行注釋

/* 塊
   注釋
 */

不同于Java仑撞,Kotlin 中 塊注釋可以嵌套。

查看 Documenting Kotlin Code 有關(guān)文檔注釋語法的信息音比。

使用 String 模板

fun main(args: Array<String>) {
//sampleStart
    var a = 1
    // simple name in template:
    val s1 = "a is $a" 
    
    a = 2
    // arbitrary expression in template:
    val s2 = "${s1.replace("is", "was")}, but now is $a"
//sampleEnd
    println(s2)
}

查看 String templates.

使用條件語句

//sampleStart
fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}
//sampleEnd

fun main(args: Array<String>) {
    println("max of 0 and 42 is ${maxOf(0, 42)}")
}

使用 if 作為表達(dá)式:

//sampleStart
fun maxOf(a: Int, b: Int) = if (a > b) a else b
//sampleEnd

fun main(args: Array<String>) {
    println("max of 0 and 42 is ${maxOf(0, 42)}")
}

查看 if-expressions.

使用 nullable 值 并且檢查 null

當(dāng)空值可能時(shí)唯鸭,引用必須被明確地標(biāo)記為可空。
如果str不包含整數(shù)硅确,則返回null :

fun parseInt(str: String): Int? {
    // ...
}

使用返回可空值的函數(shù):

fun parseInt(str: String): Int? {
    return str.toIntOrNull()
}

//sampleStart
fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // Using `x * y` yields error because they may hold nulls.
    if (x != null && y != null) {
        // x and y are automatically cast to non-nullable after null check
        println(x * y)
    }
    else {
        println("either '$arg1' or '$arg2' is not a number")
    }    
}
//sampleEnd

fun main(args: Array<String>) {
    printProduct("6", "7")
    printProduct("a", "7")
    printProduct("a", "b")
}

或者

fun parseInt(str: String): Int? {
    return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)
    
//sampleStart
    // ...
    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)
//sampleEnd
}

fun main(args: Array<String>) {
    printProduct("6", "7")
    printProduct("a", "7")
    printProduct("99", "b")
}

查看 Null-safety.

使用類型檢查和自動轉(zhuǎn)換

is 運(yùn)算符檢查表達(dá)式是否是類型的實(shí)例。如果為特定類型檢查不可變的局部變量或?qū)傩悦靼梗瑒t不需要顯式轉(zhuǎn)換:

//sampleStart
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
}
//sampleEnd


fun main(args: Array<String>) {
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
    }
    printLength("Incomprehensibilities")
    printLength(1000)
    printLength(listOf(Any()))
}

或者

//sampleStart
fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // `obj` is automatically cast to `String` in this branch
    return obj.length
}
//sampleEnd

fun main(args: Array<String>) {
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
    }
    printLength("Incomprehensibilities")
    printLength(1000)
    printLength(listOf(Any()))
}

甚或

//sampleStart
fun getStringLength(obj: Any): Int? {
    // `obj` is automatically cast to `String` on the right-hand side of `&&`
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}
//sampleEnd


fun main(args: Array<String>) {
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "... err, is empty or not a string at all"} ")
    }
    printLength("Incomprehensibilities")
    printLength("")
    printLength(1000)
}

查看 ClassesType casts.

使用 for 循環(huán)

fun main(args: Array<String>) {
//sampleStart
    val items = listOf("apple", "banana", "kiwi")
    for (item in items) {
        println(item)
    }
//sampleEnd
}

或者

fun main(args: Array<String>) {
//sampleStart
    val items = listOf("apple", "banana", "kiwi")
    for (index in items.indices) {
        println("item at $index is ${items[index]}")
    }
//sampleEnd
}

查看 for loop.

使用 while 循環(huán)

fun main(args: Array<String>) {
//sampleStart
    val items = listOf("apple", "banana", "kiwi")
    var index = 0
    while (index < items.size) {
        println("item at $index is ${items[index]}")
        index++
    }
//sampleEnd
}

查看 while loop.

使用 when 表達(dá)式

//sampleStart
fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }
//sampleEnd

fun main(args: Array<String>) {
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000L))
    println(describe(2))
    println(describe("other"))
}

查看 when expression.

使用范圍

使用操作符檢查數(shù)字是否在范圍內(nèi):

fun main(args: Array<String>) {
//sampleStart
    val x = 10
    val y = 9
    if (x in 1..y+1) {
        println("fits in range")
    }
//sampleEnd
}

檢查數(shù)字是否超出范圍:

fun main(args: Array<String>) {
//sampleStart
    val list = listOf("a", "b", "c")
    
    if (-1 !in 0..list.lastIndex) {
        println("-1 is out of range")
    }
    if (list.size !in list.indices) {
        println("list size is out of valid list indices range too")
    }
//sampleEnd
}

迭代范圍:

fun main(args: Array<String>) {
//sampleStart
    for (x in 1..5) {
        print(x)
    }
//sampleEnd
}

或過程:

fun main(args: Array<String>) {
//sampleStart
    for (x in 1..10 step 2) {
        print(x)
    }
    for (x in 9 downTo 0 step 3) {
        print(x)
    }
//sampleEnd
}

查看 Ranges.

使用集合

迭代集合:

fun main(args: Array<String>) {
    val items = listOf("apple", "banana", "kiwi")
//sampleStart
    for (item in items) {
        println(item)
    }
//sampleEnd
}

使用運(yùn)算符 is 檢查集合是否包含對象:

fun main(args: Array<String>) {
    val items = setOf("apple", "banana", "kiwi")
//sampleStart
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
//sampleEnd
}

使用lambda表達(dá)式過濾和映射集合:

fun main(args: Array<String>) {
    val fruits = listOf("banana", "avocado", "apple", "kiwi")
//sampleStart
    fruits
        .filter { it.startsWith("a") }
        .sortedBy { it }
        .map { it.toUpperCase() }
        .forEach { println(it) }
//sampleEnd
}

查看 Higher-order functions and Lambdas.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菱农,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柿估,更是在濱河造成了極大的恐慌循未,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秫舌,死亡現(xiàn)場離奇詭異的妖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)足陨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門嫂粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墨缘,你說我怎么就攤上這事星虹。” “怎么了镊讼?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵宽涌,是天一觀的道長。 經(jīng)常有香客問我蝶棋,道長卸亮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任玩裙,我火速辦了婚禮兼贸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘献酗。我一直安慰自己寝受,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布罕偎。 她就那樣靜靜地躺著很澄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甩苛,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天蹂楣,我揣著相機(jī)與錄音,去河邊找鬼讯蒲。 笑死痊土,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墨林。 我是一名探鬼主播赁酝,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旭等!你這毒婦竟也來了酌呆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤搔耕,失蹤者是張志新(化名)和其女友劉穎隙袁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弃榨,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菩收,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲸睛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜饵。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖官辈,靈堂內(nèi)的尸體忽然破棺而出划咐,到底是詐尸還是另有隱情,我是刑警寧澤钧萍,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布褐缠,位于F島的核電站,受9級特大地震影響风瘦,放射性物質(zhì)發(fā)生泄漏队魏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一万搔、第九天 我趴在偏房一處隱蔽的房頂上張望胡桨。 院中可真熱鬧,春花似錦瞬雹、人聲如沸昧谊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呢诬。三九已至涌哲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尚镰,已是汗流浹背阀圾。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狗唉,地道東北人初烘。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像分俯,于是被迫代替她去往敵國和親肾筐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容