Kotlin基本語法

譯自Kotlin Basic Syntax

定義包

軟件包定義(Package specification)應(yīng)位于源文件的頂部:

package my.demo

import java.util.*

// ...

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

參見包(Packages) 眉菱。

定義函數(shù)

具有Int返回類型的兩個Int參數(shù)的函數(shù):

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

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

具有表達(dá)體(expression body)和推斷返回類型(inferred return type)的函數(shù):

fun sum(a: Int, b: Int) = a + b

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

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

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

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

Unit返回類型可以省略:

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

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

請參閱函數(shù)(Functions) 试幽。

定義局部變量

賦值一次(只讀)(Assign-once (read-only))局部變量:

fun main(args: Array<String>) {
    val a: Int = 1  // immediate assignment
    val b = 2   // `Int` type is inferred
    val c: Int  // Type required when no initializer is provided
    c = 3       // deferred assignment
    println("a = $a, b = $b, c = $c")
}

可變(Mutable)變量:

fun main(args: Array<String>) {
    var x = 5 // `Int` type is inferred
    x += 1
    println("x = $x")
}

另請參見屬性和字段 (Properties And Fields)。

注釋

就像Java和JavaScript一樣影所,Kotlin支持行尾和塊注釋赠制。

// This is an end-of-line comment

/* This is a block comment
   on multiple lines. */

與Java不同边酒,Kotlin中的塊注釋可以嵌套经柴。

有關(guān)文檔注釋語法的信息,請參閱注釋Kotlin代碼 (Documenting Kotlin Code )墩朦。

使用字符串模板

fun main(args: Array<String>) {
    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"
    println(s2)
}

請參閱String模板 (String templates)坯认。

使用條件表達(dá)式

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

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

使用if表達(dá)式:

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

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

查看if-expressions

使用可空值(nullable values)并檢查null

當(dāng)空值可能時氓涣,引用必須被明確地標(biāo)記為可空(explicitly marked as nullable when null value is possible) 牛哺。

如果str不包含整數(shù),則返回null :

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

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

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

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")
    }    
}


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)
    
    // ...
    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")
}

見空安全(Null-safety) 劳吠。

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

is運(yùn)算符檢查表達(dá)式是否是類型的實(shí)例引润。 如果檢查不可變(immutable)局部變量或?qū)傩詾樘囟愋停瑒t不需要顯式轉(zhuǎn)換:

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
}

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()))
}

或者

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

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


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()))
}

甚至

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
}


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)
}

請參閱類(Classes)和類型轉(zhuǎn)換 (Type casts)痒玩。

使用for循環(huán)

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

要么

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

參見for循環(huán)(for loop) 淳附。

使用while循環(huán)

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

看到while循環(huán) (while loop)。

表達(dá)when使用

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

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

看when表達(dá)式(when expression)凰荚。

使用范圍

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

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

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

fun main(args: Array<String>) {
    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")
    }
}

在一個范圍內(nèi)迭代:

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

或過程(progression):

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

見范圍(Ranges) 燃观。

使用集合

在一個集合內(nèi)迭代:

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

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

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

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

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

請參閱高階函數(shù)和Lambdas(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
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了失球。 大學(xué)時的朋友給我發(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)容

  • 前言 人生苦多蛇受,快來 Kotlin 句葵,快速學(xué)習(xí)Kotlin! 什么是Kotlin龙巨? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,161評論 9 118
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理笼呆,服務(wù)發(fā)現(xiàn),斷路器旨别,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 帶你快速入門诗赌,讀懂Kotlin基本語法~ 基本語法 定義包 包應(yīng)該在源文件的頭部聲明: 不需要匹配目錄和包:源文件...
    AeolusFei閱讀 683評論 0 2
  • 包聲明 如: 引入類 與Java沒啥區(qū)別 有多個包會默認(rèn)導(dǎo)入到每個 Kotlin 文件中: 函數(shù)定義 一般函數(shù) 函...
    郎官人閱讀 406評論 1 0
  • 上篇介紹了Kotlin的特點(diǎn)以及其在Android Studio上的配置步驟,下面接著記錄一些Kotlin的基本語...
    ArsenicBing閱讀 617評論 0 2