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分支的简化。
- 不需要使用case关键字;
- case值后的冒号改为使用箭头(->);
- default改为更有意义、更明确的else。
如果when分支包含多条语句,则需要使用花括号将这些语句括成一个代码块。
var score='B'
when(score){
'A'-> {
println("优秀")
println("百尺竿头更进一步")
}
'B'-> {
println("良好")
println("不拼一把,你不知道自己能行")
}
'C'-> println("中")
'D'-> println("及格")
else-> {
println("不及格")
println("下次加油")
}
}
输出结果:
良好
不拼一把,你不知道自己能行
when分支的3个改进:
- when分支可以匹配多个值;
- when分支后的值不要求是常量,可以是任意表达式;
- when分支对条件表达式的类型没有任何要求。
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电饭锅
您输入的包含特殊字符
学海无涯苦作舟

网友评论