17. 分支表达式

作者: 厚土火焱 | 来源:发表于2017-11-15 00:32 被阅读33次

    分支语句我们都知道,而这次我们要看一下分支表达式。
    先看分支语句的代码【这里的账号密码仅为写demo,生产环境不能这样实现】

    private const val USERNAME = "kotlin"
    private const val PASSWORD = "jetbrains"
    
    fun main(args: Array<String>) {
        println("请输入账号:")
        val username = readLine()
        println("请输入密码:")
        val password = readLine()
    
        if (username == USERNAME && password == PASSWORD){
            println("登录成功")
        }else{
            println("登录失败")
        }
    }
    

    以上是分支语句的写法,运行可见下面的结果。

    请输入账号:
    kotlin
    请输入密码:
    jetbrains
    登录成功
    

    当你输入账号,又输入密码,会显示登录结果。
    那么分支表达式是怎么样的?
    假设系统登录有 2 种用户,一种是普通用户,一种是管理员。先在上面的代码中增加管理员常量。

    private const val ADMIN_USERNAME = "admin"
    private const val ADMIN_PASSWORD = "admin"
    

    再增加系统的运行模式。一种是管理员模式,一种是用户模式。

    private const val MANAGER = 1
    private const val USER = 0
    

    我们希望系统运行的时候传入一个值,来判定当前需要使用管理员模式还是用户模式运行。那么可以这样实现

        var mode = USER
        if (args.isNotEmpty() && args[0]=="1"){
            mode = MANAGER
        }else{
            mode = USER
        }
    

    当传入的参数为 1 时,启用管理员模式,当传入其他参数时,启用用户模式。
    但是,我们注意到这里有一个问题。作为模式的变量是可变的,它在运行时可以被修改,这不符合业务逻辑。用常量才符合。
    这时就可以用分支表达式来实现了。

        val mode
        =if (args.isNotEmpty() && args[0]=="1"){
            MANAGER
        }else{
            USER
        }
    

    代码改成这样就可以了。
    var 改成了 val ,这样初始化之后就不会被改变了。
    后面的 = 把分支表达式的结果赋值给 mode,所赋的值就是 MANAGER 或 USER 。
    格式化一下这段代码,我们可以看的更清晰一些。

        val mode = if (args.isNotEmpty() && args[0] == "1") {
            MANAGER
        } else {
            USER
        }
    

    这是 if表达式
    同样的实现也可以用 when 来实现。
    在 kotlin 中没有 switch ,它的功能由 when 来进行很好的发挥。我们再看一个例子

    fun main(args: Array<String>) {
        val x = 5
        when(x){
            is Int -> println("Hello $x")
            in 1..100 -> println("$x is in 1..100")
            !in 1..100 -> println("$x is not in 1..100")
            args[0].toInt() -> println("$x == args[0]")
        }
    }
    

    当 x 是 整数的时候,执行

     println("Hello $x")
    

    当 x 在 1到100之间时,执行

    println("$x is in 1..100")
    

    当 x 不在 1到100之间时,执行

    println("$x is not in 1..100")
    

    还可以和其他数值做比较,比如和系统带入的参数比较,当为相等的整数时,执行

    println("$x == args[0]")
    

    当然,when 的各个条件是从上而下顺序比较的。当遇到第一个满足条件的分支后,就不在与其他分支比较了。
    如果把 when 应用到前面用户登录的那个例子中,写成 when 表达式也是可以的。
    我们可以这样写

        val mode = when{
            args.isNotEmpty() && args[0] == "1" -> MANAGER
            else -> USER
        }
    

    和 if 一样,每个分支的最后一句代码,都是这个分支的返回值
    修改完善一下登录的代码

    package com.cofox.kotlin
    
    /**
     * chapter01
     * @Author:  Jian Junbo
     * @Email:   junbojian@qq.com
     * @Create:  2017/11/14 23:15
     * Copyright (c) 2017 Jian Junbo All rights reserved.
     *
     * Description:
     */
    
    private const val USERNAME = "kotlin"
    private const val PASSWORD = "jetbrains"
    
    private const val ADMIN_USERNAME = "admin"
    private const val ADMIN_PASSWORD = "admin"
    
    private const val MANAGER = 1
    private const val USER = 0
    
    fun main(args: Array<String>) {
       /* val mode = if (args.isNotEmpty() && args[0] == "1") {
            MANAGER
        } else {
            USER
        }*/
    
        val mode = when{
            args.isNotEmpty() && args[0] == "1" -> MANAGER
            else -> USER
        }
    
        println("请输入账号:")
        val username = readLine()
        println("请输入密码:")
        val password = readLine()
    
        if (mode == USER && username == USERNAME && password == PASSWORD) {
            println("用户登录成功")
        } else if (mode == MANAGER && username == ADMIN_USERNAME && password == ADMIN_PASSWORD) {
            println("管理员登录成功")
        } else {
            println("登录失败")
        }
    }
    
    

    运行这段代码,带入不同的参数,可以看到管理员和用户的不同登录效果。
    最后要注意,写分支表达式表达式的时候要注意各种情况的完备性,如果写少了某种情况,会有BUG,不能保证初始化赋值成功。

    相关文章

      网友评论

        本文标题:17. 分支表达式

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