Kotlin 控制流语句

缺乏、安全感 2022-05-08 09:33 314阅读 0赞

在kotlin中我们可以使用if、when、for、while这几种控制流语句。与java不同的是,kotlin取消了传统的switch语句而改用when语句来实现。

if表达式

语法格式:

  1. if (used by atomicExpression)
  2. : "if" "(" expression ")" controlStructureBody SEMI? ("else" controlStructureBody)?
  3. ;

首先我们看下传统用法:

  1. var number = 20;
  2. if (number > 15) {
  3. print("The number is more than 15")
  4. }

我们同样可以使用if…else if …else这样在其他语言中存在的习惯用法:

  1. var number = 15;
  2. if (number > 20) {
  3. print("The number is more than 20")
  4. } else if (number == 20) {
  5. print("The number is equals")
  6. } else {
  7. print("The number is less than 20")
  8. }

如果你的条件分支超过3条,那么kotlin会建议你采用when这种更加简洁的方式:
在这里插入图片描述

接下来我们看一下在kotlin中if作为表达式的使用:

  1. var stuNumber = 55;
  2. var stu = if (stuNumber > 50) 50 else stuNumber
  3. print(stu)

输出:

  1. 50

在这里,if作为一个表达式(例如:返回它的值或者把它赋给变量),也就是意味着它可以返回一个值,在这种情况下,else分支是必须的。如果上面的例子没有else分支,那么你会得到如下的错误提示:
在这里插入图片描述

同样的,作为表达式使用的时候,if的分支可以是代码块,最后的表达式作为该块的值:

  1. var stuNumber = 15;
  2. var maxStu = if (stuNumber > 50) {
  3. print("The students max number is 50")
  4. 50
  5. }else{
  6. print("The students number is $stuNumber")
  7. stuNumber
  8. }
  9. print("\n")
  10. print(maxStu)

输出:

  1. The students number is 15
  2. 15

如果我们试着在if和else分支块的末尾加一句代码:

  1. var maxStu = if (stuNumber > 50) {
  2. ...
  3. true
  4. }else{
  5. ...
  6. false
  7. }

结果输出:

  1. false

所以有一点大家的记清楚了,if作为表达式:最后的表达式作为该块的值。

When 表达式

when表达式的语法在kotlin的文档中我们也可以找到:

  1. when (used by atomicExpression)
  2. : "when" ("(" expression ")")? "{"
  3. whenEntry*
  4. "}"
  5. ;
  6. whenEntry (used by when)
  7. : whenCondition{","} "->" controlStructureBody SEMI
  8. : "else" "->" controlStructureBody SEMI
  9. ;
  10. whenCondition (used by whenEntry)
  11. : expression
  12. : ("in" | "!in") expression
  13. : ("is" | "!is") type
  14. ;

最简单的使用就和我们以前知道的switch是一样的:

  1. var index = 1
  2. when (index) {
  3. 1 -> {
  4. print("index is 1")
  5. }
  6. 2 -> {
  7. print("index is 2")
  8. }
  9. else -> {
  10. print("index is 1")
  11. }
  12. }

其中如果是简单的代码块我们也可以使用kotlin官方示例的写法,不用花括号进行代码块的标识,当然了额,个人意见,使用{}将分支的代码包裹起来,可以让我们更容易区分代码结构。

  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 作为一个表达式使用,则必须有 else 分支, 除非编译器能够检测出所有的可能情况都已经覆盖了[例如,对于 枚举(enum)类条目与密封(sealed)类子类型]。

也就是说任何情况下我们提供一个else分支是没有任何坏处的,这就相当于switch的default分支。

记得swicth如果有多分支需要用相同的方式处理,一般的写法应该是:

  1. case 1:
  2. case 2:
  3. break;

这样的形式,在kotlin中是将多个分支条件放在一起,用逗号分隔:

  1. 1, 2, 3, 4 -> {
  2. print("index is $index")
  3. }

我们也可以检测一个值在(in)或者不在(!in)一个区间或者集合中:

  1. var index = 4
  2. when (index) {
  3. in 1..3 -> {
  4. print("index is less than 3")
  5. }
  6. !in 1..3 -> {
  7. print("index is more than 3")
  8. }
  9. }

还有一种就是检测一个值是(is)或者不是(!is)一个特定类型的值:

  1. var a: Any = "100"
  2. when (a) {
  3. is Char -> print("char")
  4. !is Number -> print("not number")
  5. else -> print("unknow")
  6. }

这里提示大家一个小技巧,如果我们使用when表达式的时候,不能确定传入的参数a的类型,此时我们在声明变量的时候就将其声明为Any类型:

  1. var a: Any = "100"

如果我们不指定类型:
在这里插入图片描述

程序无法通过编译,提示我们冲突的类型。

另外就是和if一样作为表达式的用法了:

  1. var results = when (a) {
  2. is Char -> "char"
  3. !is Number -> "not number"
  4. else -> "unknow"
  5. }

如果它被当做表达式, 符合条件的分支的值就是整个表达式的值,这一点大家在使用的时候的自己注意。

循环语句
常见的for、while、do…while语法和我们以前接触的大同小异:

  1. for (used by loop)
  2. : "for" "(" annotations (multipleVariableDeclarations | variableDeclarationEntry) "in" expression ")" controlStructureBody
  3. ;
  4. while (used by loop)
  5. : "while" "(" expression ")" controlStructureBody
  6. ;
  7. doWhile (used by loop)
  8. : "do" controlStructureBody "while" "(" expression ")"
  9. ;

for 循环
for 可以循环遍历任何提供了迭代器的对象,这相当于像 C# 这样的语言中的 foreach 循环.

  1. var array: Array<Int> = Array(5) { i -> i + 1 }
  2. for (value in array){
  3. print(value)
  4. }

对于某些特殊场景比如我们需要索引的时候,我们可以通过下面两种方式获得索引值:

  1. for (value in array.indices){
  2. print(value)
  3. }

如果我们打印一下array.indices的值大家就会发现 ,它返回的其实是数组的索引范围:

  1. 0..4

通过这种变相的方式为我们提供了元素的索引值。另外一种方式是:

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

在这里插入图片描述

for的另一种使用场景就是区间迭代:

  1. for (i in 1..3) {
  2. println(i)
  3. }

这和我们使用array.indices的原理是一致的。

while语句的使用我们就简单的使用官方文档内容:

  1. while (x > 0) {
  2. x--
  3. }
  4. do {
  5. val y = retrieveData()
  6. } while (y != null) // y 在此处可见

发表评论

表情:
评论列表 (有 0 条评论,314人围观)

还没有评论,来说两句吧...

相关阅读

    相关 初识kotlin—3、控制语句

    前言:今年谷歌宣布kotlin(以下简称为kt)已经成为安卓的官方开发语言,kt的重要性可想而知。就我大约接触一个月的时间来看(中间有事情耽误了),16年的时候以为kt还比较新