疯狂kotlin讲义连载之流程控制——顺序结构与分支结构 三

4.2.4 when表达式

if 分支相同, when 分支也可作为表达式。

如果 when 分支被当做表达式, 符合条件的分支的代码块的值就是整个表达式的值。与 if 分支相同的是,如果分支的执行体是一个代码块,该代码块的值就是块中最后的表达式的值。

when 语句作为表达式使用时, when 表达式也需要有一个返回值,因此 when 表达式通常必须有 else 分支,除非编译器能够检测出所有的可能情况都已经被覆盖了。

如下代码示范了 when 表达式的用法。

程序清单: codes\04\4.2\WhenExpr.kt

fun main(args: Array<String>){

var score = 'B'

val str = when (score) {

'A' -> {

println("望百尺竿头更进步")

"优秀"

}

'B' -> {

println("不拼一把,你不知道自己的能力")

"良好"

}

'C' -> ""

'D' -> "及格"

else -> {

println("啥也不说了,下次再来")

"不及格"

}

}

println(str)

}

上面程序示范了 when 表达式的用法,在 when 表达式的每个分支的代码块的最后都定义了一个表达式作为该代码块的值,这样既可保证 when 表达式可以返回有效的值。运行上面程序可看到如下输出。

不拼一把,你不知道自己的能力

良好

上面输出的第一行是执行 when 表达式中特定分支的输出。第二行输出是 when 表达式的返回值。

4.2.5 when分支处理范围

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

程序清单: codes\04\4.2\WhenRange.kt

fun main(args: Array<String>){

val age = java.util.Random().nextInt(100)

println(age)

//使用when表达式对str赋值

var str = when (age){

in 10..25 -> "当时年少青衫薄"

in 26..50 -> "风景依稀似去年"

in 51..80 -> "醉听清吟胜管弦"

else -> "其他"

}

println(str)

}

上面程序使用 when 表达式对 age 变量进行判断,该 when 表达式不再要求 age 等于某个具体的值,只要 age 处于特定范围中,即可进入相应的分支。运行该程序,可看到如下输出。

39

风景依稀似去年

从上面运行结果可以看出:当 age 变量为 39 时,它处于 26..50 之间, when 表达式将会返回该分支的值。

4.2.6 when分支处理类型

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

程序清单: codes\04\4.2\WhenTypeDetect.kt

fun main(args: Array<String>){

var inputPrice = 26

println(realPrice(inputPrice))

}

//程序对inputPrice的类型进行判断

fun realPrice(inputPrice: Any) = when(inputPrice){

//如果inputPrice的类型为String,程序返回该字符串转换的Double

is String -> inputPrice.toDouble()

//如果inputPrice的类型为Int,程序返回该Int值转换的Double

is Int -> inputPrice.toDouble()

is Double -> inputPrice

else -> 0.0

}

上面程序使用 when 表达式对 inputPrice 的类型进行判断,程序中 inputPrice 参数可能是任意类型,因此程序判断如果 inputPrice String 类型,则调用 String 对象的 toDouble() 将其转换为 Double 后返回;如果 inputPrice Int 类型,则调用 Int toDouble 将其转换为 Double 后返回;如果 inputPrice Double 类型,则直接返回 inputPrice

4.2.7 when条件分支

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

程序清单: codes\04\4.2\WhenFork.kt

fun main(args: Array<String>){

//读取一行输入val ln = readLine()// lnString?类型,所以需要先判断ln不为null

if(ln != null){

// when分支不需要任何条件表达式

when {

//每个分支条件都是布尔表达式

ln.matches(Regex("\\d+")) -> println("您输入的全是数字")

ln.matches(Regex("[a-zA-Z]+")) -> println("您输入的全是字母")

ln.matches(Regex("[a-zA-Z0-9]+")) -> println("您输入的是字母和数字")

else -> println("您输入的包含特殊字符")

}

}

}

从上面代码可以看出,此时的 when 分支不需要任何条件表达式,此时每个分支都是一个布尔表达式,当某个分支的布尔表达式为 true 时, when 将会执行该分支的代码。

运行上面程序,程序将会根据用户输入反馈不同的输出。如下所示。

124327

您输入的全是数字

以上内容节选自《疯狂Kotlin讲义》:一本让您最直接认识Kotlin的疯狂讲义


本书即将于2017年11月发售 敬请期待

往期连载

第十九期:juejin.im/post/5a13bc…

第二十期: juejin.im/post/5a14e8…

第二十一期:juejin.im/post/5a20bb…

相关书籍《疯狂Android讲义》item.jd.com/11689014.ht…


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值