Kotlin语法(四)控制流

时间:2022-10-06 20:07:34

   If表达式

        在Kotlin中,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 
  }

    For循环

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

for (item incollection)

  print(item)

 

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

for (item: Int inints) {

  // ...

}

 

       for{: .keyword }可以循环遍历任何提供了迭代器的集合。

        Ø  有一个成员函数或者扩展函数iterator(),它返回一个类型

        Ø  有一个成员函数或者扩展函数next(),并且

        Ø 有一个成员函数或者扩展函数hasNext()返回 Boolean.

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

for (i inarray.indices)

 print(array[i])

    While循环

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

while (x > 0) {

  x--

}

//

do {

  val y = retrieveData()

} while (y != null) // y is visible here!

    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 } 分支是必须的,除非编译器能够检测出所有的可能情况都已经覆盖了。

 

        1.        多个分支合并

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

when (x) {

  0, 1 -> print("x == 0 or x ==1")

  else -> print("otherwise")

}

 

         2.        在判断分支条件的地方使用任何表达式

when (x) {

  parseInt(s) -> print("s encodesx")

  else -> print("s does not encodex")

}

 

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

when (x) {

  in 1..10 -> print("x is in therange")

  in validNumbers -> print("x isvalid")

  !in 10..20 -> print("x is outside therange")

  else -> print("none of theabove")

}

 

        4.        可以检查一个值is{: .keyword }或者!is{: .keyword }某种特定类型

        由于smart casts,你可以访问该类型的方法和属性而不用额外的检查。

val hasPrefix = when(x) {

  isString -> x.startsWith("prefix")

 else -> false

}

 

        5.        可以用来替代if{: .keyword }-else{: .keyword }链

        不提供参数,所有的分支条件都是简单的布尔值,而当一个分支的条件返回true时,则调用该分支:

when {

  x.isOdd() -> print("x is odd")

  x.isEven() -> print("x is even")

  else -> print("x is funny")

}