Kotlin流程控制——分支结构

2019-06-28  本文已影响0人  程序员丶星霖

Kotlin提供了两种基本的流程控制结构:分支结构和循环结构

如果没有流程控制,Kotlin程序的语句是一个顺序执行流,从上向下一次执行每条语句。

Kotlin提供了两种分支控制结构:if分支和when分支

一般来说,当条件较为简单且可能的情况很少时,使用if分支;当条件比较复杂且可能的情况很多时,可以考虑使用when分支。

一、if分支

Kotlin的if分支即可作为语句使用,也可作为表达式使用。

Kotlin的if语句有如下三种形式:

第一种形式:

    var age=26
    if (age > 20) {
        println("年龄已经大于20岁了")
    }

第二种形式:

    var age=26
    if (age > 20) {
        println("年龄已经大于20岁了")
    }else{
        println("年龄小于等于20岁")
    }

第三种形式:

    var age=26
    if (age>60){
        println("老年人")
    }else if(age>40){
        println("中年人")
    }else if (age > 20) {
        println("青年人")
    }

if else语句有一条基本规则:总是优先把包含范围小的条件放在前面处理。

二、if表达式

Kotlin的if分支还可以作为表达式使用。

    var age=26
    var str= if (age>20) "age大于20" else if (age<20) "age小于20" else "age等于20"
    println(str)

输出结果:

age大于20

if表达式的分支也可以使用花括号括起来的代码块,此时代码块的最后一个表达式的值将作为整个代码块的值

    var age=26
    var str= if (age>20){
        println("大于20的分支")
        "age大于20"
    }else if (age < 20) {
        println("小于20的分支")
        "age小于20"
    }else{
        println("else的分支")
        "age等于20"
    }
    println(str)

输出结果:

大于20的分支
age大于20

三、when分支语句

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

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

when分支其实就是switch分支的简化。

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

var score='B'
    when(score){
        'A'-> {
            println("优秀")
            println("百尺竿头更进一步")
        }
        'B'-> {
            println("良好")
            println("不拼一把,你不知道自己能行")
        }
        'C'-> println("中")
        'D'-> println("及格")
        else-> {
            println("不及格")
            println("下次加油")
        }
    }

输出结果:

良好
不拼一把,你不知道自己能行

when分支的3个改进:

    var score='B'
    when(score){
        'A','B'-> {
            println("优秀")
            println("百尺竿头更进一步")
        }
        'C','D'-> println("中")
        else-> {
            println("不及格")
            println("下次加油")
        }
    }

.
输出结果:

优秀
百尺竿头更进一步

when分支后的值可以是任意表达式。

    var score='B'
    var str="EFGH"
    when(score){
        str[0]-4,str[1]-4-> {
            println("优秀")
            println("百尺竿头更进一步")
        }
        str[2]-4,str[3]-4-> println("中")
        else-> {
            println("不及格")
            println("下次加油")
        }
    }

输出结果:

优秀
百尺竿头更进一步

when分支的条件表达式可以是任意类型。

    var data=Date()
    when(data){
        Date()-> {
            println("优秀")
            println("百尺竿头更进一步")
        }
        else-> {
            println("不及格")
            println("下次加油")
        }
    }

输出结果:

优秀
百尺竿头更进一步

四、when表达式

when分支也可作为表达式。如果when分支被当做表达式,符合条件的分支的代码块的值就是整个表达式的值。

当when语句作为表达式使用时,when表达式也需要有一个返回值,所以when分支表达式必须有else分支,除非所有的可能情况都已经被覆盖了。

 var score = 'B'
    val str=when(score){
        'A'->{
            println("百尺竿头更进一步")
            "优秀"
        }
        'B'->{
            println("不拼一把,没怎么能知道自己的能力")
            "良好"
        }
        'C'->"中"
        'D'->"及格"
        else->{
            println("下次再来")
            "不及格"
        }
    }

    println(str)

输出结果:

不拼一把,没怎么能知道自己的能力
良好

五、when分支处理范围

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

    val age = Random().nextInt(100)
    println(age)
    var str = when (age) {
        in 10..25->"当时年少青衫薄"
        in 26..50->"风景依稀似去年"
        in 51..80->"醉听清吟胜管弦"
        else->"其他"
    }
    println(str)

输出结果:

19
当时年少青衫薄

六、when分支处理类型

通过使用is、!is运算符检查表达式是否为指定类型。

fun main(args: Array<String>) {
    var inputPrice = 26
    println(realPrice(inputPrice))
}

fun realPrice(inputPrice: Any) = when (inputPrice) {
    is String -> inputPrice.toDouble()
    is Int -> inputPrice.toDouble()
    is Double -> inputPrice
    else -> 0.0
}

输出结果:

26.0

七、when条件分支

when分支还可以用来取代if...else if链。

    val ln= readLine()
    if (ln != null) {
        when{
            ln.matches(Regex("\\d+"))-> println("您输入的全是数字")
            ln.matches(Regex("[a-zA-Z]+"))->println("您输入的全是字母")
            ln.matches(Regex("[a-zA-Z0-9]+"))->println("您输入的是字母和数字")
            else-> println("您输入的包含特殊字符")
        }
    }

输出结果:

6545电饭锅
您输入的包含特殊字符

学海无涯苦作舟

我的微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读