[关闭]
@cxm-2016 2016-11-22T11:44:23.000000Z 字数 2273 阅读 1752

Kotlin(五)——控制流

Kotlin

版本:1
翻译:李颖

转载自:Kotlin Reference



if 表达式

在 Kotlin 中, if 是一个表达式, 也就是说, 它有返回值. 因此, Kotlin 中没有三元运算符(条件 ? then 分支返回值 : else 分支返回值), 因为简单的 if 表达式完全可以实现同样的任务.

  1. // if 的传统用法
  2. var max = a
  3. if (a < b)
  4. max = b
  5. // 使用 else 分支的方式
  6. var max: Int
  7. if (a > b)
  8. max = a
  9. else
  10. max = b
  11. // if 作为表达式使用
  12. val max = if (a > b) a else b

if 的分支可以是多条语句组成的代码段, 代码段内最后一个表达式的值将成为整个代码段的返回值:

  1. val max = if (a > b) {
  2. print("Choose a")
  3. a
  4. } else {
  5. print("Choose b")
  6. b
  7. }

如果你将 if 作为表达式来使用(比如, 将它的值作为函数的返回值, 或将它的值赋值给一个变量), 而不是用作普通的流程控制语句, 这种情况下 if 表达式必须有 else 分支.

when 表达式

when 替代了各种 C 风格语言中的 switch 操作符. 最简单的形式如下例:

  1. when (x) {
  2. 1 -> print("x == 1")
  3. 2 -> print("x == 2")
  4. else -> { // 注意, 这里是代码段
  5. print("x is neither 1 nor 2")
  6. }
  7. }

when 语句会将它的参数与各个分支逐个匹配, 直到找到某个分支的条件成立. when 可以用作表达式, 也可以用作流程控制语句. 如果用作表达式, 满足条件的分支的返回值将成为整个表达式的值. 如果用作流程控制语句, 各个分支的返回值将被忽略. (与 if 类似, 各个分支可以是多条语句组成的代码段, 代码段内最后一个表达式的值将成为整个代码段的值.)

如果其他所有分支的条件都不成立, 则会执行 else 分支. 如果 when 被用作表达式, 则必须有 else 分支, 除非编译器能够证明其他分支的条件已经覆盖了所有可能的情况.

如果对多种条件需要进行相同的处理, 那么可以对一个分支指定多个条件, 用逗号分隔:

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

在分支条件中, 我们可以使用任意的表达式(而不仅仅是常数值)

  1. when (x) {
  2. parseInt(s) -> print("s encodes x")
  3. else -> print("s does not encode x")
  4. }

我们还可以使用 in 或 !in 来检查一个值是否属于一个 范围, 或者检查是否属于一个集合:

  1. when (x) {
  2. in 1..10 -> print("x is in the range")
  3. in validNumbers -> print("x is valid")
  4. !in 10..20 -> print("x is outside the range")
  5. else -> print("none of the above")
  6. }

还可以使用 is 或 !is 来检查一个值是不是某个类型. 注意, 由于 Kotlin 的 智能类型转换 功能, 进行过类型判断之后, 你就可以直接访问这个类型的方法和属性, 而不必再进行显式的类型检查.

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

when 也可以用来替代 if-else if 串. 如果没有指定参数, 那么所有的分支条件都应该是单纯的布尔表达式, 当条件的布尔表达式值为 true 时, 就会执行对应的分支:

  1. when {
  2. x.isOdd() -> print("x is odd")
  3. x.isEven() -> print("x is even")
  4. else -> print("x is funny")
  5. }

for 循环

任何值, 只要能够产生一个迭代器(iterator), 就可以使用 for 循环进行遍历. 语法如下:

  1. for (item in collection)
  2. print(item)

循环体可以是多条语句组成的代码段.

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

前面提到过, 凡是能够产生迭代器(iterator)的值, 都可以使用 for 进行遍历, 也就是说, 遍历对象需要满足以下条件:

上述三个函数都需要标记为 operator.

for 循环遍历数组时, 会被编译为基于数组下标的循环, 不会产生迭代器(iterator)对象.

如果你希望使用下标变量来遍历数组或 List, 可以这样做:

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

注意, 上例中的 “在数值范围内的遍历” 会在编译期间进行优化, 运行时不会产生额外的对象实例.

或者, 你也可以使用 withIndex 库函数:

  1. for ((index, value) in array.withIndex()) {
  2. println("the element at $index is $value")
  3. }

while 循环

while 和 do..while 的功能与其他语言一样:

  1. while (x > 0) {
  2. x--
  3. }
  4. do {
  5. val y = retrieveData()
  6. } while (y != null) // y is visible here!

循环的中断(break)与继续(continue)

Kotlin 的循环支持传统的 break 和 continue 操作符.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注