Kotlin——程序的基本逻辑结构之选择、循环和跳转基本语法
引言
前一篇文章总结了Kotlin的基本数据类型,如果把程序比作一个有机体的话,基本数据只是构成一个躯壳,而没有灵魂的躯壳是意义不大的。同样的如果程序中没有控制逻辑很多情况下这程序是不完整的,因为不可能每一句代码之间都是从上往下逐句去执行,而程序中的灵魂就是我们的要讲的控制逻辑。
一、条件选择结构
Kotlin中条件选择结构主要有两种:if-else if -else 和when。
1、if-else if -else
在Kotlin中if-else if -else条件从句除了拥有Java 中if条件从句的所有功能,用法也大同小异,还有更高级的功能(类似Java中的三元运算符—— 条件 ? 条件值满足时返回的值 : 不满足时返回的值)。在Kotlin中if 是一个表达式,也就意味着他会返回值,且if的分支是还可以是代码块。最后需要注意:如果你使⽤ if 作为表达式⽽不是语句,该表达式必须有 else 分⽀配对。
- 传统用法
if(conditionexp){
...
}else if(conditionexp2){
...
}else{
...
}
- 作为表达式使用,实现三元运算符功能
var a=9
var b=80
val max = if (a > b) a else b
println("max"+max)//输出 max 80
- 作为表达式使用,分支使用代码块
var a=9
var b=80
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
println("max"+max)//输出Choose bmax80
2、when 条件从句
when -else条件从句就相当于升级版的switch-case从句,运行逻辑大同小异。when 也将它的参数(也可以不提供参数)和各分⽀条件顺序⽐较,直到某个分⽀满⾜条件。和if 类似,when的分支条件可以是任意表达式(不只只是常量),不过需要注意的是,。如果when被用做表达式(必须有 else 分⽀), 符合条件的分⽀的值就是整个表达式的值;如果当做语句使⽤, 则忽略个别分⽀的值。(像 if ⼀样,每⼀个分⽀可以是⼀个代码块,它的值是块中最后的表达式的值),最后,如果其他分⽀都不满⾜条件将会求值 else 分⽀。
- 普通用法
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
3,4 ->print("x == 3 /4")
else -> { // 注意这个块
...
}
}
}
- 使用表达式作为分支条件
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
- 使用when实现检测某个值是否在某个区间
val x:Int=8
when (x) {
in 1..10 -> print("x is in the range")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
- when不提供参数(相当于if-else if-else功能),所有的分⽀条件都是简单的布尔表达式,⽽当⼀个分⽀的条件为真时则执⾏该分⽀
val x:Int=8
when {
x>9 -> print("x >9 ")
x<9 -> print("x > 9")
else -> print("x is funny")
}
二、循环
在Kotlin中循环结构和Java功能一模一样,也拥有三种形式:for、while(condition)、do-while,用法也是一样的,也没有啥特别的。
- for 可以循环遍历任何提供了迭代器的对象,迭代之后可以通过成员函数或者扩展函数 iterator() 获取它的返回类型,也可以通过成员函数或者扩展函数 next() 获取下一个值还可以通过并且成员函数或者扩展函数 hasNext() 判断是否遍历到尽头。
for (item in collection) print(item)
- for循环集合的索引遍历(这种“通过一个范围的迭代”形式在编译的时候会被优化而不会创建额外的对象。)
for (i in array.indices) {
print(array[i])
}
- 使用withIndex完成遍历(形式在编译的时候会被优化而不会创建额外的对象。)
val asc = Array(5, { i -> (i * i).toString() })
//index,value为关键字
for ((index, value) in asc.withIndex()) {
println("the element at $index is $value")
}
- while和do-while
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y 在此处可⻅
三、跳转结构continue、break和return
continue、break、return结构功能用法和Java中的一样。
- return——默认从最直接包围它的函数或者匿名函数返回。
- break——终⽌当前层次的循环。
- continue——跳出当前当次的循环,继续下⼀次循环
四、标签Label
在Kotlin中任何表达式都可以⽤标签(Label)来标记,使用标识符后跟@符号来定义一个标签(即aaa@qq.com,例如:aaa@qq.com 、aaa@qq.com 都是有效的标签),使用@后跟标识符来引用一个标签(@xxx)。其实呢标签就有点类似goto语句的作用,有点像通过外力来改变程序默认的逻辑而运行到定义标签处。
一般来说,标签通常是用于限制continue、break、return的调整,关于标签的更多使用后续再详解。