Kotlin——流程控制

作者: So_ProbuING | 来源:发表于2021-04-26 10:18 被阅读0次

    与Java类似,Kotlin同样提供了两种基本的流程控制结构:分支结构和循环结构

    顺序结构

    在任何编程语言中最常见的程序结构就是顺序结构,顺序结构就是程序从上到下一行行地执行,中间没有任何判断和跳转

    分支结构

    if分支

    Kotlin的if分支既可作为语句使用,也可作为表达式使用
    Kotlin的if语句有如下三种形式:

    1. if
    if(expression){
      statements...
    }
    
    1. if else
    if(expression){
      statements...
    }else{
      statements...
    }
    
    1. if else if
    if(expression){
      statements...
    }
    else if(expression){
      statements...
    }
    ...
    else{
      statements
    }
    

    如果if、else if、else后的代码块只有一行语句,则可以省略花括号。

     var age = 20
        if (age>=30){
            println("大于等于30")
        }else{
            println("不大于30")
        }
    

    if表达式

    Kotlin的if分支还可作为表达式使用,整个if表达式(包括else)最终会返回一个值,因此if可以代替java中的三目运算符

     var age = 20
        var str = if(age>20) "age大于20" else if(age<20) "age小于20" else "age等于20"
        println("str的值为${str}")
    

    当使用if分支作为表达式时,由于if表达式必须要有返回值,因此if表达式需要有else部分

    when分支语句

    when分支取代了Java原有的switch语句

     var score = 'B'
    
        when(score){
            'A' -> print("优秀")
            'B' -> print("优秀")
            'C' -> print("良好")
            else -> print("不及格")
        }
    

    从上面的程序不难发现 when分支其实就是switch分支的简化,when分支的改变有以下几点:

    • 不再使用case关键字
    • case值后的冒号改为使用箭头(->)
    • default 改为else

    when分支如果包含多条语句,则需要使用花括号将这些语句括成一个整体形成代码块

    when分支比Switch分支强大的地方

    • when 分支可以匹配多个值
    • when分支后的值不要求是常量,可以是任意表达式
    • when分支对条件表达式的类型没有任何要求
    var score = 'D'
    
        when(score){
            'A','B' ->{
                println("A、B取值范围内")
            }
            'C','D' ->{
                println("C、D取值范围内")
            }
            
        }
    

    when表达式

    与if分支相同,when分支也可作为表达式
    如果when分支被当做表达式,那么符合条件的分支的代码块的值就是整个表达式的值
    当when语句作为表达式使用时,when表达式也需要有一个返回值,因此when表达式通常必须有else分支

      //when表达式
        var score = 'A'
    
        var str = when(score){
            'A' -> "A"
            'B' -> "B"
            else -> "unKnow"
        }
    
        println(str)
    

    when分支处理范围

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

     var randomInt = Random().nextInt(100)
        print("随机数取值${randomInt}")
        when (randomInt) {
            in 10..25 -> print("在10-25")
            in 26..50 -> print("在26-50")
            in 51..80 -> print("在51-80")
            else -> print("其他")
        }
    

    when分支处理类型

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

      var inputArr = 26
        when(inputArr){
            is String -> print("是字符串String")
            is Int -> print("是int")
            is Double -> println("是double")
            else -> 0.0
        }
    

    when条件分支

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

      var rl = readLine()
        if (rl != null) {
    
            when {
                rl.matches(Regex("\\d+")) -> {
                    print("您输入的都是数字")
                }
    
                rl.matches(Regex("[a-zA-Z]+")) -> {
                    print("您输入的是字母")
                }
                rl.matches(Regex("[a-z0-9A-Z]+")) -> {
                    println("您输入的是字母和数字")
                }
                else -> {
                    println("您输入的是特殊符号")
                }
            }
        }
    
    • 当when用作条件分支时,不需要任何条件表达式,每个分支都是一个布尔表达式

    循环结构

    循环语句可以在满足循环的情况下,反复执行某一段代码。循环语句可能包含如下4个部分。

    • 初始化语句:一条或多条语句,用于完成一些初始化工作,初始化语句在循环开始之前执行
    • 循环条件:这是一个布尔表达式,这个表达式能决定是否执行循环体
    • 循环体:这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行。如果这个代码块只有一行语句,则这个代码块的花括号是可以省略的
    • 迭代语句 这个部分在一次循环体执行结束后,对循环条件求值之前执行。通常用于控制循环条件中的变量

    while循环

    • 语法
    [init_statement]
    while(test_expression){
      body_statement
      {iteration_statements}
    }
    

    while循环在每次执行循环体之前,都要先对test_expression循环条件求值,如果循环条件为真,则运行循环体部分。

    fun whileCirculation() {
        var count = 0
        while (count<50){
            print("count${count}")
            count++
        }
        println("循环结束")
    }
    
    • 使用while循环时 要保证有结束循环条件 避免死循环
    • 如果while循环的循环体只有一行语句,那么Kotlin允许省略循环体的花括号

    do while循环

    do while循环与while循环的区别在于:while循环是先判断循环条件,如果条件为真则执行循环体;do while循环则先执行循环体,然后才判断循环条件

    • 语法
    [init_statement]
    do{
      body_statement
      [iteration_statement]
    }while(test_expression)
    
    fun doWhileCirculation() {
        var count = 0;
        do {
            count++
            print("count${count}")
        } while (count < 30)
        println("循环结束")
    }
    

    即使test_expression循环条件的值一开始就是假,do while循环也会执行循环体,也就是说do while循环的循环体至少执行一次

    for-in 循环

    for-in 循环专门用于遍历范围、序列和集合等包含的元素

    for(变量名 in 字符串|范围|集合){
      statements
    }
    
    • for-in 循环中的常量无须声明。for-in循环中的常量将会在每次循环开始时自动被赋值
    • for-in循环可用于遍历任何可迭代对象,可迭代对象就是该对象包含一个iterator()方法,且该方法的返回值对象具有next()、hasNext()方法
    fun forCirculation() {
        var max = 7
        var result =1
        for (num in 1..max){
            result*=num
        }
        println(result)
    }
    

    for-in循环的循环计数器相当于用val声明的常量,因此不允许被重新赋值

    嵌套循环

    如果把一个循环放在另一个循环体内,那么就形成了嵌套循环,嵌套循环既可以是for-in循环嵌套while循环 也可以是while循环嵌套do while循环

     var i = 10
        var j = 10
        for (iv in 0..i){
            for (jv in 0..j) {
                println("i ${iv} j ${jv}")
            }
        }
    

    控制循环结构

    break

    break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦循环体重遇到break,系统将完全结束循环 并开始执行循环之后的代码

    fun breakFinish() {
        val i = 100
        for (a in 1..i) {
            if (a > 50) {
                println("循环结束${a}")
                break
            }
        }
        println("after continue")
    }
    

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

     //结束外层循环
        a@for(a in 0 until 10){
            for (b in 2 until 30){
                println("a ${a} b ${b}")
                if (b == 15) {
                    break@a
                }
            }
        }
    

    break后的标签必须使一个有效的标签,即这个标签必须在break语句所在的循环之前定义

    continue

    continue可以忽略本次循环剩下的语句,接着开始下一次循环,并不会结束循环

     for (i in 1..10) {
            print("i ${i}")
            if (i ==5) {
                continue
            }
        }
    

    与break类似,continue后也可以紧跟一个标签,用于直接跳过标签所标识循环的当次循环的剩下语句

    return

    return用户从函数或者匿名函数中返回。当程序执行遇到return时,这个函数或方法将被结束

          returnFinish()
        println("主程序继续执行")
    }
    
    fun returnFinish() {
        for (i in 1 until 100){
            print("i的值${i}")
            if (i == 99) {
                return
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Kotlin——流程控制

        本文链接:https://www.haomeiwen.com/subject/pakdrltx.html