分支语句我们都知道,而这次我们要看一下分支表达式。
先看分支语句的代码【这里的账号密码仅为写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,不能保证初始化赋值成功。
网友评论