在Kotlin中,if
是一个表达式,即它会返回一个值。因此就不需要三元运算符(条件?然后:否则),因为普通的if
就能胜任这个角色。
var max = a
if (a > b) max = a
val max = if (a > b) a else b
if
的分支可以是代码块,最后的表达式作为该块的值:
val max2 = if (a > b) {
print("choose a")
a
} else {
print("choose b")
b
}
注:如果使用if
作为表达式而不是语句,那么该表达式需要有else
分支。
when
取代了类C语言的switch操作符。其最简单的形式如下:
when (x) {
1 -> println("x == 1")
2 -> println("x == 2")
else -> {
println("x is neither 1 nor 2")
}
}
when
将它的参数和所有的分支条件顺序比较,知道某个分支满足条件。when
既可以被当作表达式使用,也可以被当作语句使用。 如果它被当作表达式,符合条件的分支的值就是整个表达式的值,如果当作语句使用,则忽略个别分支的值。
如果其他分支都不满足条件将会求值else
分支。如果when
作为一个表达式使用,则必须有else
分支,除非编译器能够检测出所有的可能情况都已经覆盖了。
如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
when (x) {
parseInt(x) -> print("s encodes x")
else -> print("s does not encode")
}
我们可以检测一个值在(in
)或者不在(!in
)一个区间或集合中:
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")
}
检测一个值是(is
)或者不是(!is
)一个特定类型的值。
fun hasPrefix(x: Any) = when (x) {
is String -> x.startsWith("prefix")
else -> false
}
for
循环可以对任何提供迭代器(iterator)的对象进行遍历,这相当于像C#这样的语言中的foreach
循环。语法如下:
val items = listOf(1, 2, 3, 4)
for (item in items) {
println(item)
}
for (index in items.indices) {
print(items[index])
}
withIndex
:for ((index, value) in items.withIndex()) {
println("the element at $index is $value")
}
while
循环主要有while
和do..while
两种,和Java中使用方法相同。
while
fun put(x: Int): Int {
var x1 = x
while (x1 > 0) {
x1--
}
return x1
}
do..while
fun con(x: Int):Int{
var x1 = x
do {
x1--
} while (x1 > 0)
return x1
}