流程控制
if,else if,else
if (条件判断) 判断成功执行的代码;
fun main() {
val a = 10
if(a == 12) //只有当a判断等于12时,才会执行下面的打印语句
println("Hello World!")
println("我是后续的语句") //if只会对紧跟着的一行代码生效,后续的内容无效
}
如果if体中有多行语句,需要使用{}包裹,只有一行就可以忽略{},类似的 else if
,else
,for
,while
等都是这样:
if (a > 100) {
println("a > 100")
println("a: $a")
}
fun main() {
val a = 100
if (a > 10) { // 判断成功时执行内部代码
println("a > 10")
println("a : $a")
} else // 判读失败执行else内部代码
println("a < 10")
}
多分支判断:
fun testIf() {
val score = 100
if (score > 90)
println("优秀")
else if (score >= 70)
println("良好")
else if (score >= 60)
println("及格")
else
println("不及格")
}
嵌套if:
if (score < 60) {
if (score < 30 ) {
println("学习Java")
} else {
println("学习Kotlin")
}
}
if (score < 60) {
if (score < 30 ) {
println("学习Java")
} else {
println("学习Kotlin")
}
}
作为返回结果赋值:
类似于Java中你的三元表达式,不过 Kotlin
中没有三元运算符,对于if,else多行代码的情况,默认最后一行作为返回结果,这种表达式必须存在else分支,否则不满足条件不就没结果了?
fun testIf2() {
val score = 32
val result = if (score shr 1 > 10) "1" else "0"
println(result)
}
when
类似于if-elseif-else
fun testWhen1() {
val rank = 'A'
when (rank) {
'A' -> println("王者")
'B' -> println("星耀")
'C' -> println("钻石")
}
}
当用when做表达式时,需要存在else分支,除非编译器能推断出所有可能的情况都包含分支条件
fun testWhen2() {
val c = 'A'
val value = when (c) {
'A' -> 0
'B' -> 1
else -> 2
}
println(value)
val d = true
val res = when (d) {
true -> 1
false -> 0
}
println(res)
}
有时候我们可能希望某些值都属于同一个情况,可以使用逗号将其条件组合成一行:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("else")
}
我们也可以使用任意表达式(不仅仅是常量)作为分支条件,比如之前的if-elseif-else:
fun testWhen3() {
val score = 70
val value = when(score) {
//使用in判断目标变量值是否在指定范围内
in 90..100 -> "优秀"
in 80..89 -> "良好"
in 70..79 -> "及格"
in 60..69 -> "牛逼"
else -> "不及格"
}
println(value)
}
for循环
基本语法:
for (遍历出来的单个目标变量 in 可遍历目标) 循环体
fun testFor1() {
for (i in 1..10) {
println("$i")
}
}
每次遍历的变量i,就是每次遍历的下一个目标,这里依次是1~10,需要注意的是,变量i只在for内部有用,包括嵌套的内部。
如果外部定义了i,在for中使用i作为遍历变量,不会改变i的值:
fun testFor2() {
var i: Int = 100
for (i in 1..10) {
println(i)
}
println(i)
}
默认每次循环都会使i+1,使用step可以自由控制步长:
fun testFor3() {
for (i in 1..10 step 2) {
println(i)
}
}
倒序遍历可以使用 downTo
:
fun testFor3() {
for (i in 10 downTo 1 step 2) {
println(i)
}
}
使用 continue
跳过本轮循环,直接开始下一轮,尽管循环体后面还有代码未执行:
fun testFor4() {
for (i in 1..3) {
if (i == 2) continue
println(i)
}
}
只会打印1和3
如果需要提前结束循环,可以使用 break
关键字,如果存在多从嵌套循环,只会对离它最近的循环生效,continue
也是一样
fun testFor5() {
for (i in 1..3) {
for (j in 1..3) {
if (i == j) break
println("$i $j")
}
}
}
如果想要终止或者加速外部循环,可以为循环打上标记:
fun testFor6() {
outer@ for (i in 1..3) {
inner@ for (j in 1..3) {
if (i == j) continue@outer
println("$i $j")
}
}
}
while循环
while(循环条件) 循环体;
相比for循环,while循环更多的用在不明确具体的结束时机的情况下,而for循环更多用于明确知道循环的情况,比如在明确要进行循环10次,此时用for循环会更加合适一些,若只知道i<=0时要结束循环,就用while比较合适:
fun testWhile1() {
var i = 100
while (i > 0) {
println(i)
i /= 2
}
}
与for循环一样,也可以使用continue或者break加速或者提前结束循环:
fun testWhile2() {
var i = 100
while (i > 0) {
if (i < 10) break
println(i)
i /= 2
}
}
我们也可以反转循环判断的时机,可以先执行循环内容,然后再做循环条件判断,这里要用到 do-while
语句:
fun testWhile3() {
var i = 100
do {
println("i: $1")
i /= 2
} while (i > 0)
}
这样不论是否满足执行条件,循环体中的内容都会先执行一遍