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

368 阅读4分钟

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参数可能是任意类型,因此程序判断如果inputPriceString类型,则调用String对象的toDouble()将其转换为Double后返回;如果inputPriceInt类型,则调用InttoDouble将其转换为Double后返回;如果inputPriceDouble类型,则直接返回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.cn/post/684490…

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