控制流程

条件控制 if

跟其他语言一样地使用 if 即可:

var x = 0
if(x>0){
    println("x 大于 0")
}else if(x==0){
    println("x 等于 0")
}else{
    println("x 小于 0")
}

if .. else 的三元写法

var numA = 10
// 在Java中可以这么写,但是Kotlin中直接会报错。
// var numB: Int = (numA > 2) ? 3 : 5
// kotlin中直接用if..else替代。例:
var numB: Int = if ( numA > 2 ) 3 else 5  // 当numA大于2时输出numB的值为3,反之为5

条件控制 when

类似于其他语言的 switch case:

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意这个块
        print("x 不是 1 ,也不是 2")
    }
}

也可以使用多值, 甚至区间:

val validNumbers = listOf(30, 40, 50)
// val validNumbers = setOf(30, 40, 50)
var x = 30 // x is valid
when (x) {
    0, 1 -> print("x == 0 or x == 1")
    in 2..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}

还可以是检测一个值是(is)或者不是(!is)一个特定类型的值。注意: 由于智能转换,你可以访问该类型的方法和属性而无需 任何额外的检测。

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

when 也可以用来取代 if-else if链。 如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支:

when {
    x.isOdd() -> print("x is odd")
    x.isEven() -> print("x is even")
    else -> print("x is funny")
}

循环控制 for

for 循环可以对任何提供迭代器(iterator)的对象进行遍历

for (item: Int in ints) {
    print(item)
}

区间

区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 形成。

for (i in 1..4) print(i) // 闭区间 [1, 4] 输出 1234
for (i in 4..1) print(i) // 什么都不输出

递增循环

使用 until 与区间用法一致, 但是排除结束元素

for (i in 0 until 5){
    print("$i \t") // [1, 5), 1 2 3 4
}
// or
for (i in 0 .. 5){
    print("$i \t") // [1, 5], 1 2 3 4 5
}

递减循环

使用 downTo 进行递减循环

for (i in 15 downTo 11){
    print("$i \t") // 15 14 13 12 11
}

步长

使用 step 设置步长

for (i in 10..16 step 2){
    print("i => $i \t")
}
for (i in 1..4 step 2) print(i) // 设置步长为2, 输出 13
for (i in 9 downTo 5 step 2) print(i) // 输出 975

循环控制 while

与其他语言的while循环类似:

var x = 5
while (x > 0) {
    println( x--)
}
var y = 5
do {
    println(y--)
} while(y>0)

循环控制 forEach

使用 forEach 循环, 循环体为一个 lambda 表达式, 循环出的每项默认为 it

var ints = setOf(1,2,3,4,5)
ints.forEach {
    if (it == 3) return
    print(it) # 12
}

使用一个匿名函数代替 lambda 表达式, 可以定义其循环项的名称, 但其 return 只作用于当前循环

var ints = setOf(1,2,3,4,5)
ints.forEach(fun(value: Int) {
    if (value == 3) return
    print(value) # 1245
})

label, Break 和 Continue

在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、fooBar@都是有效的标签。 要为一个表达式加标签,我们只要在其前加标签即可。

loop@ for (i in 1..100) {
    // ……
}

我们可以用标签限制 break 或者 continue:

loop@ for (i in 1..100) {
    for (j in 1..100) {
      if (i==10) break@loop
    }
}

lambda 表达式的标签处返回

var ints = setOf(1,2,3,4,5)
ints.forEach lit@{
    if (it == 3) return@lit
    print(it) # 1245
}

通常情况下使用隐式标签更方便, 该标签与接受该 lambda 的函数同名。

var ints = setOf(1,2,3,4,5)
ints.forEach {
    if (it == 3) return@forEach
    print(it) # 1245
}

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress