if...else
在 Kotlin 中,if...else是一个表达式,即它会返回一个值。
// 作为表达式
val max = if (a > b) a else b
if 的分支可以是代码块,最后的表达式作为该块的值:
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
注意:
- if...else可以达到和三目运算符相同的效果,所以kotlin就不需要三目运算符
- if...else的返回值是可以忽略的,忽略后就和java的语句没什么差别
- 当使用 if 作为表达式而不是语句(例如:返回它的值或者把它赋给变量),该表达式需要有 else 分支。
(取消了三目运算符对不少人应该是好消息吧,带有返回值也是很棒的设计)
when
在 Kotlin 中,when取代了类 Java的 switch-case语句。when语句的形式入下:
when (x) {
//普通条件下,没有Java中的case和break语句
1 -> print("x == 1")
//多个条件有相同的处理时,可以把多个条件放在一起,用逗号分隔
2,3 -> print("x == 2 or x == 3")
//可以用任意表达式和函数(而不只是常量)作为分支条件
1+3 -> print("x == 4")
add(1+4) -> print("x == 5")
//可以检测一个值在(in)或者不在(!in)一个区间或者集合中
in 6..10 -> print("x is in the 6~10")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
//这里的else相当与Java的default语句
else -> {
print("x is neither 1 nor 2")
}
}
和if...else类似,when也是一个表达式,具有返回值,满足条件的分支中最后的表达式就是其返回值
var result = when (x % 2) {
0 -> {
println("x是偶数")
0
}
else -> {
println("x是奇数")
1
}
}
when还可以检测一个值是(is)或者不是(!is)一个特定类型的值。注意: 由于智能转换,你可以访问该类型的方法与属性而无需任何额外的检测。
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
可以不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支,从而取代if-else if链
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
自 Kotlin 1.3 起,可以使用以下语法将 when 的主语(subject,译注:指 when 所判断的表达式)捕获到变量中:
fun Request.getBody() =
when (val response = executeRequest()) {
is Success -> response.body
is HttpError -> throw HttpException(response.status)
}
(总之666,这个when相比于java的简直太强大了有没有)
for
for 循环可以对任何提供迭代器(iterator)的对象进行遍历,这相当于像 Java 中的 foreach 循环
Kotlin | Java |
---|---|
for (item in collection) print(item) |
for (int item in collection) System.out.print(item) |
Kotlin中,在数字区间上迭代,请使用区间表达式替代java中的for(;;)
语句:
for (i in 1..3) {
println(i)
}
for (i in 6 downTo 0 step 2) {
println(i)
}
通过索引遍历一个数组或者一个 list,可以这么做:
for (i in array.indices) {
println(array[i])
}
//可以用库函数 withIndex
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
(这个for配合一些关健字可以实现一些花式遍历呢)
while和do...while
while和do...while的用法和java一致
(不容易啊,终于看到一个和java用法一致的了)