条件
条件语句可以让程序在满足特定条件时执行相应语句。这个特定条件最终值是Boolean
类型,当它为true
时,会执行相应内容。
if
if (条件) ...
if (条件) ... else
if (条件) ... else if ... else ...
下面是一个简单的例子
fun main() {
val int = 1
if (int > 0) {
print("int 大于 0")
}
}
int 大于 0
当 if
语句后边只跟了一个语句时,可以省略花括号{}
fun main() {
val int = 1
if (int > 0) print("int 大于零")
}
Note:省略花括号
{}
时,if/else
只作用于其后边的第一个语句fun main() { val int = 0 if (int > 0) print("只有在大于 0 时我才执行"); print("无论何时我都执行") }
无论何时我都执行
我们还可以添加else
,你可以尝试更改int
的值,看看运行结果:
fun main() {
val int = 0
if (int > 0) {
print("int 大于 0")
}else {
print("int 小于等于 0")
}
}
int 小于等于 0
如果有两个以上的条件,还可以添加else if
,可以加多个:
fun main() {
val int = 1
// 不一定需要写 else
if (int > 0) println("int > 0")
else if(int < 0) println("int < 0")
if (int > 0) println("int > 0")
else if(int == 0) println("int = 0")
else println("int < 0")
if (int > 1) print("int > 1")
else if (int > 0) print("0 < int <= 1")
else if (int == 0) print("int = 0")
else print("int < 0")
}
int > 0
int > 0
0 < int <= 1
if
语句还可以用于赋值:
fun main() {
val int = 1
val msg = if (int > 0) "int > 0" else "int <= 0"
print(msg)
}
int > 0
当包含多个语句时,末尾的值将作为其值:
fun main() {
val int = 1
val result = if (int > 0) {
println("int > 0")
true
} else {
println("int <= 0")
false
}
print(result)
}
int > 0
true
when
when(变量) {
值1 -> ...
值2 -> ...
...
else -> ...
}
when {
条件1 -> ...
条件2 -> ...
...
else -> ...
}
同样地,else
语句不一定需要;当分支的语句只有一句时,花括号{}
也可以省略:
fun main() {
val name = "Kotlin"
var flag = false // 当 name 为 Kotlin 时改为 true
print("Hello ")
when(name) {
"Kotlin" -> {
println("Kotlin")
flag = true
}
"Java" -> println("Java")
else -> println("Unknown")
}
print(flag)
}
Hello Kotlin
true
fun main() {
val name = "ABC"
val canPrint = true
when {
name == "Kotlin" && canPrint ->
print("Hello Kotlin")
canPrint -> print("Unknown")
}
}
Unknown
when
也可以用于赋值,此时else
分支不可省略(除非分支涵盖了可能的所有情况):
fun main() {
val isKotlin = true
val name = when(isKotlin) {
true -> "Kotlin"
else -> "others"
}
print(name)
}
Kotlin
fun main() {
val isKotlin = true
// isKotlin 只有两个值,所以这里不需要 else
val name = when(isKotlin) {
true -> "Kotlin"
false -> "others"
}
print(name)
}
Kotlin
fun main() {
val isKotlin = true
val name = when {
isKotlin -> {
println("Hello Kotlin")
"Kotlin"
}
else -> "others"
}
print(name)
}
Hello Kotlin
Kotlin
循环
循环指是让程序重复地做某件事。
for
for (元素名: 类型 in 变量) ...
因为类型推断的存在,我们不需要显式指定类型
for (元素名: 类型 in 变量) ...
打印出String
中的每一个字符:
fun main() {
val kotlin = "Kotlin"
for (char in kotlin) {
println(char)
}
}
K
o
t
l
i
n
打印出数组中的元素:
fun main() {
val array = arrayOf(3, 2, 1)
for (int in array) println(int)
}
3
2
1
Note:能够使用
for
语法的变量(in
后面的)都是具有一个标记为operator
的iterator(): Iterator<T>
函数(或者叫方法,在类中的叫法),这是数组的interator()
public class Array<T> { ... /** * Creates an [Iterator] for iterating over the elements of the array. */ public operator fun iterator(): Iterator<T> }
使用withIndex()
方法结合解构可以遍历下标+元素值:
fun main() {
val array = arrayOf(3, 2, 1)
for ((index, int) in array.withIndex()) {
println("$index $int")
}
}
0 3
1 2
2 1
也可以使用forEach
和forEachIndexed
完成上述操作:
fun main() {
val array = arrayOf(3, 2, 1)
array.forEach {
println(it)
}
println()
array.forEachIndexed { index, int ->
println("$index $int")
}
}
3
2
1
0 3
1 2
2 1
可以使用Range
表达式(Range Expression)生成指定范围内的数字(不支持浮点数Float
、Double
,除了Long
,其他类型会转为Int
):
- 增序。使用
..
生成包含末尾值(左闭右闭)的范围;使用..<
(Kotlinv1.9.22
及之前用的是until
,现在也能用)生成不包含末尾值(左闭右开)的范围。fun main() { for (int in 0..2) println(int) println() for (int in 0..<2) println(int) // for (int in 0 until 2) println(int) }
0 1 2 0 1
- 倒序
fun main() { for (int in 2 downTo 0) println(int) }
2 1 0
- 指定步长
fun main() { for (int in 0..2 step 2) println(int) println() for (int in 2 downTo 0 step 2) println(int) }
0 2 2 0
while
当条件成立时,while
将执行相应内容。
while(条件) ...
do ... while(条件)
fun main() {
var count = 0
while (count < 2) {
println("第 $count 次")
count++
}
}
第 0 次
第 1 次
Note:
count++
是自增1
,相当于count = count + 1
,类似的还有count--
(自减1
)、++count
、--count
。下方是count++
与++count
的对比,在单独写出时,它们的效果没有区别。在访问其值时,count++
会先给出当前值,再加1
;而++count
会先加1
,再返回值(count--
和--count
类似)。fun main() { var count = 0 println(count++) println(count) }
0 1
fun main() { var count = 0 println(++count) println(count) }
1 1
fun main() {
var count = 0
do {
println("第 $count 次")
count++
} while (count < 2)
}
第 0 次
第 1 次
从结果来看,二者是相同的,但do-while
会不管条件是否成立,先执行一次,以下是对比:
fun main() {
var count = 2
while (count < 2) {
println("while 第 $count 次")
count++
}
count = 2
do {
println("do-while 第 $count 次")
count++
} while (count < 2)
}
do-while 第 2 次
break 和 continue
在循环中(for
或while
),可以使用break
跳出循环,使用continue
跳过一次循环:
当count == 2
时,执行了break
,跳出了for
循环,来到了循环外
。
fun main() {
for (count in 0 .. 4) {
if (count == 2) break
println(count)
}
print("循环外")
}
0
1
循环外
当count == 2
时,跳过了count
为2
的那一次循环,所以打印结果中没有2
。
fun main() {
for (count in 0 .. 4) {
if (count == 2) continue
println(count)
}
print("循环外")
}
0
1
3
4
循环外