type: doc layout: reference category: "Syntax"

title: "Control Flow"

控制流

If表达式

在Kotlin中, if{: .keyword }是一个表达式,它会返回一个值. 因此就不需要三元运算符 (如 ? 三元表达式), 因为使用 if{: .keyword } 就可以了。

// Traditional usage 
var max = a 
if (a < b) 
  max = b 

// With else 
var max: Int
if (a > b) 
  max = a 
else 
  max = b 

// As expression 
val max = if (a > b) a else b

if{: .keyword }的分支可以是代码段, 最后一行的表达式作为段的返回值:

val max = if (a > b) { 
    print("Choose a") 
    a 
  } 
  else { 
    print("Choose b") 
    b 
  }

if{: .keyword }仅仅有一个分支, 或者其中一个分支的返回结果Unit, 它的类型Unit.

See the grammar for if{: .keyword }.

When表达式

when{: .keyword } 替代了c语言风格的switch操作符. 最简单的形式如下:

when (x) {
  1 -> print("x == 1")
  2 -> print("x == 2")
  else -> { // Note the block
    print("x is neither 1 nor 2")
  }
}

when{: .keyword } 将它的参数和所有的分支条件进行比较,直到某个分支满足条件。 when{: .keyword }既可以被当做表达式使用也可以被当做语句使用。 如果它被当做表达式, 符合条件的分支的值就是整个表达式的值,如果当做语句使用,则忽略单个分支的值。(就像if{: .keyword },每一个分支可以是一个代码块,它的值是最后的表达式的值.)

else{: .keyword } 分支将被执行如果其他分支都不满足条件。 如果 when{: .keyword } 作为一个表达式被使用,else{: .keyword } 分支是必须的,除非编译器能够检测出所有的可能情况都已经覆盖了。

如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起, 用,逗号分隔:

when (x) {
  0, 1 -> print("x == 0 or x == 1")
  else -> print("otherwise")
}

我们可以在判断分支条件的地方使用任何表达式,而不仅仅是常量(和switch不同):

when (x) {
  parseInt(s) -> print("s encodes x")
  else -> print("s does not encode x")
}

我们也可以检查一个值 in{: .keyword } 或者 !in{: .keyword } 一个 范围 或者集合:

when (x) {
  in 1..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{: .keyword }或者!is{: .keyword }某种特定类型.注意,由于smart casts, 你可以访问该类型的方法和属性而不用额外的检查。

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

when{: .keyword } 也可以用来替代if{: .keyword }-else{: .keyword } if{: .keyword }链. 如果不提供参数,所有的分支条件都是简单的布尔值,而当一个分支的条件返回true时,则调用该分支:

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

查看 grammar for when{: .keyword }.

For循环

for{: .keyword } 循环可以对任何提供迭代器(iterator)的集合进行遍历,语法如下:

for (item in collection)
  print(item)

循环体可以是一个代码块.

for (item: Int in ints) {
  // ...
}

像上面提到的一样, for{: .keyword }可以循环遍历任何提供了迭代器的集合。例如:

  • 有一个成员函数或者扩展函数iterator(),它返回一个类型
    • 有一个成员函数或者扩展函数next(),并且
    • 有一个成员函数或者扩展函数hasNext()返回 Boolean.

如果你想要遍历一个数组或者一个list,你可以这么做:

for (i in array.indices)
  print(array[i])

注意这种“遍历一个范围”的函数会被编译器优化,不会产生额外的对象。

See the grammar for for{: .keyword }.

While循环

while{: .keyword } 和 do{: .keyword }..while{: .keyword } 的使用方法和其他语言一致

while (x > 0) {
  x--
}

do {
  val y = retrieveData()
} while (y != null) // y is visible here!

查看 grammar for while{: .keyword }.

Break和continue在循环中的使用

在循环中Kotlin支持传统的break{: .keyword }和continue{: .keyword }操作符.查看Returns and jumps.