流程控制

分支结构

Kotlin 提供了两种常见的分支控制结构: if分支和 when 分支 。其中 if分支使用布尔表达式或布尔值作为分支条件来进行分支控制;而 when 分支则更适用于复杂的条件。一般来说,当条件较为简单且可能的情况很少时,使用 if 分支;当条件比较复杂且可能的情况很多时,可以考虑使用 when分支。

if分支

Kotlin 的 if语句的形式。

if (expression) {
statements ...
else if (expression) {
statements ...
}
... //可以有零个或多个 else if语句
else{
statements ...
}

if表达式

Kotlin 的 if分支还可作为表达式使用。也就是说,整个if表达式(包括 else 部分)最终会返回一个值,如果没返回值,则返回kotlin.Unit。因此 if可以代替 Java 中的三目运算符。

fun main(args: Array) {
    var age = 18
    //将 if 表达式赋值给 str 变量
    var str = if (age > 20)
        "age大于20"
    else if (age < 20) {
        println("小于哦")
        "age小于20"
    } else
        "age等于20"
    println(str)
}

when分支

when 分支取代了 Java 原有的 switch 语句,when 分支后的值不再要求是常量或字面值,可以是任意表达式 。

fun main(args: Array) {
    var score = 'B'
    var str = "EFGH"
    when (score) {
        'A' -> println("优秀")
        'B' -> {
            println("一般般优秀")
        }
        'C', 'D' -> println("差了点")
        str[0] - 5 -> println("对不起,打扰了!")
        else -> {
            println("需要努力了")
        }
    }
}

when分支不再对条件表达式的类型有任何要求, when分支的条件表达式可以是任意类型 。 例如,只要 when 的条件表达式与某个分支的值通过“==”比较返回 true,就能执行该分支的代码

fun main(args: Array) {
    var date = Date()
    //when 分支的条件表达式是 Date 类型 
    when (date) {
        Date() -> {
            println("优秀")
            println("望百尺竿头更进一步")
        }
        else -> {
            println("不优秀")
        }
    }
    
}

when表达式

与 if分支相同, when分支也可作为表达式。
如果 when 分支被当作表达式,那么符合条件的分支的代码块的值就是整个表达式的值。 与 if 分支相同的是,如果分支的执行体是一个代码块,那么该代码块的值就是块中最后的表达式的值 。当 when语句作为表达式使用时, when表达式也需要有一个返回值,因此 when表达式通常必须有 else分支,除非编译器能够检测出所有的可能情况都己经被覆盖了。

fun main(args: Array) {
    var score ='b'
    var str = when(score){
        'A' ->{
            println("优秀")
            "AAAA"
        }
        'B' ->{
            println("良")
            "BBBB"
        }
        else ->{
            println("没救了")
            "DDDD"
        }
    }

    println(str)
}

when 分支处理范围

通过使用 in、 !in 运算符,我们还可以使用 when 分支检查表达式是否位于指定区间或集合中 。 例如:

fun main(args: Array) {
    var age =Random().nextInt(100)
    println(age)
    var str = when(age){
        in 10..25 ->{
            println("优秀")
            "AAAA"
        }
        in 25..90 ->{
            println("良")
            "BBBB"
        }
        else ->{
            println("没救了")
            "DDDD"
        }
    }

    println(str)
}

when分支处理类型

通过使用 is、!is 运算符,我们还可以使用 when 分支检查表达式是否为指定类型 。例如:

fun main(args: Array) {
    var inputPrice = 26
    println(realPrice(inputPrice))
}
//程序对 inputPrice 的类型进行判断
fun realPrice(intputPrice:Any)=when(intputPrice){
    //如果 inputPrice 的类型为 String, 程序返回该字符串转换的 Double 值
    is String -> intputPrice.toDouble()
    //如果 inputPrice 的类型为 Int,程序返回该 Int 值转换的 Double 值
    is Int -> intputPrice.toDouble()
    is Double -> intputPrice
    else ->0.0
}

when条件分支

when分支还可以用来取代 if...else if链,此时不需要为 when分支提供任何条件表达式, 每个分支条件都是一个布尔表达式,当指定分支的布尔表达式为 true 时执行该分支。例如:

fun main(args: Array) {
    var inputPrice = "11"
    when{
        inputPrice.matches(Regex("\\d+")) -> println("全是数字")
        inputPrice.matches(Regex("[a-zA-Z]+")) -> println("全是字母")
        inputPrice.matches(Regex("[a-zA-Z0-9]+")) -> println("数字和字母")
        else -> println("您输入的包含特殊字符")
    }
}

循环结构

循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。当反复执行这个循环体时 , 需要在合适的时候把循环条件改为假,从而结束循环; 否则循环将一直执行下去,形成死循环。

while循环

while 循环的语法格式如下:

[init statements)
while test expression {
body_statements [iteration statements)
}

fun main(args: Array) {
    var inputPrice = 0
    while (inputPrice<10){
        println(inputPrice)
        inputPrice++
    }
}

do while循环

do while 循环与 while 循环的区别在于: while 循环是先判断循环条件,如果条件为真则执行循环体;而 do while 循环则先执行循环体,然后才判断循环条件,如果循环条件为真,则执行下一次循环 ,否则中止循环。do while 循环的循环体至少执行一次。do while 循环的语法格式如下:

[init statements] do
body statements [iteration statements]
}while (test expression)

fun main(args: Array) {
    var inputPrice = 0
    do {
        println(inputPrice)
        inputPrice++
    }while (inputPrice<10)
}

for-in循环

for-in 循环专门用于遍历范围、序列和集合等包含的元素。for-in 循环的语法格式如下:

for (常量名 in 字符串|范围|集合){
statements
}

对于上面语法格式有两点说明。

  • for-in 循环中的常量无须声明。 for-in 循环中的常量将会在每次循环开始时自动被赋值,因此该常量无须提前声明。只要将它包含在 for-in 循环的声明中,即可隐式声明该常量,无须使用 let关键字声明。
  • for-in循环可用于遍历任何可迭代对象。所谓可选代对象就是该对象包含一个 iterator() 方法,且该方法的返回值对象具有 next()、 hasNext()方法,这三个方法都使用 operator 修饰。
fun main(args: Array) {
    var max = 7
    var result = 1
    //使用 for-in循环遍历范围
    for (num in 1..max) {
        result *= num
        println(result)
    }
}

嵌套循环

fun main(args: Array) {
    //外层循环
    for(i in 0 until 5){
        var j = 0
        //内层循环
        while( j <3 ) {
            println(j)
            j++
        }
    }
}

控制循环结构

Kotlin 语言没有提供 goto 语句来控制程序的跳转,这种做法提高了程序流程控制的可读性,但降低了其灵活性。为了弥补这种不足,Kotlin提供了continue和 break来控制循环结构。除此之外,使用 return 可以结束整个方法,当然也就结束了一次循环 。

使用 break结束循环

某些时候,需要在某种条件出现时强行中止循环,而不是等到循环条件为 false时才退出循环 。 此时,可以使用 break来完成这个功能。break 用于完全结束一个循环,跳出循环体 。 不管是哪种循环, 一旦在循环体中遇到break,系统将完全结束该循环,开始执行循环之后的代码。 例如:

fun main(args: Array) {
    //外层循环
    for (i in 0 until 5) {
        println(i)
        if (i == 2) {
            break
        }
    }
}

使用 break 语句不仅可以结束其所在的循环,还可以直接结束其外层循环 。此时需要在 break 后紧跟一个标签,这个标签用于标识一个外层循环 。
Kotlin 中的标签就是一个紧跟着@的标识符。 Kotlin 中的标签只有放在循环语句或 switch 语句之前才起作用。例如下面代码。

fun main(args: Array) {
    //外层循环, outer 作为标识符
    outer@ for (i in 0 until 5) {
        //内层循环
        for (j in 0 until 3) {
            println("i的值为:${i}, j的值为:${j}")
            if(j==1){
                //跳出 outer 标签所标识的循环
                break@outer
            }

        }
    }
}

break 后的标签必须是一个有效的标签,即这个标签必须在 break 语句所 在的循环之前定义,或者在其所在循环的外层循环之前定义。

使用 continue 忽略本次循环的剩下语句

continue 的功能和 break有点类似,区别是 continue 只是忽略本次循环的剩下语句,接着开始下一次循环,并不会中止循环;而 break则是完全中止循环本身。如下:

fun main(args: Array) {
   for (i in 0 until 5) {
       println(i)
       if(i==2){
           continue
       }
       println("continue之后的语句")
  }
}

与 break 类似的是,continue 后也可以紧跟一个标签,用于直接跳过标签所标识循环的当次循环的剩下语句 ,重新开始下一次循环。例如:

fun main(args: Array) {
    //外层循环, outer 作为标识符
    outer@ for (i in 0 until 5) {
        //内层循环
        for (j in 0 until 3) {
            println("i的值为:${i}, j的值为:${j}")
            if(j==1){
                //忽略 outer 标签所指定的循环中当次循环剩下的语句
                continue@outer
            }

        }
    }
}

使用 return 结束方法

return 用于从最直接包围它的方法、函数或者匿名函数返回。当函数或方法执行到一条return语句时( return 关键字后还可以跟变量、常量和表达式),这个函数或方法将被结束。
Kotlin 程序中的大部分循环都被放在函数或方法中执行, 一旦在循环体内执行到一条 return 语句时 , return语句就会结束该函数或方法,循环自然也随之结束 。

fun main(args: Array) {
    test()
}

fun test(){
    for (i in 0 until 5) {
        println("i的值为:${i}")
        if(i==2){
            return
        }
    }
}

你可能感兴趣的:(流程控制)