控制流
1.if表达式
If可以返回一个值
使用:
val v = if(3>4) 5 else 1
If的分支可以使代码块,最后的表达式作为该块的值,如果使用if作为表达式而不是语句,该表达式需要有else分支
2.when表达式
When取代了switch,不会顺序执行,when将参数和所有的分支条件顺序比较,直到某个分支满足条件,when既可以被当做表达式使用也可以当做语句使用,如果被当做表达式,符号条件的分支的值就是整个表达式的值,如果当做语句使用,则忽略个别分支的值(像if一样,每一个分支可以是一个代码块,它的值是块中最后的表达式的值)
如果其他分支都不满足条件就会求值else分支,如果when作为一个表达式使用,则必须有else分支,除非编译器能够检测出所有的可能情况都已经覆盖了.
如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
可以使用任意表达式作为分支条件
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
也可以检测一个值在in或者不在!in一个区间或者集合中
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!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
}
When也可以取代if-else if 如果不提供参数,所有的分支条件都是简单的布尔表达式,当顺序执行的一个分支的条件为真的时候就执行该分支
val age = 16
when {
true -> {print("age == 3")}//执行 并终止
true -> {print("age == 2")}
else -> {
print("age is neither 3 nor 2")
}
}
3.for循环
for循环可以对任何提供迭代器(iterator)的对象进行遍历
for(item in collection) print(item)
具有迭代器的对象需要的条件:
A.有一个成员函数或者扩展函数iterator()
B.有一个成员函数或者扩展函数next()
C.有一个成员函数或者扩展函数hasNext() 返回boolean
这三个函数都需要标记为operator
对数组的for循环会被编译为并不创建迭代器的基于索引的循环
for(i in array.indices) {
Print(array[i])
}
或者可以用库函数withIndex:
for((index,value) in array.withIndex()) {
Print(“$index is $value”)
}
4.while循环
同java一样
5.跳转
在kotlin中任何表达式都可以用标签来标记,标签的格式为标识符后跟@符号,例如:abc@
a@ for (i in 1..100) {
b@ for(j in 1..100) {
if(i == 50) break@a
}
}
Kotlin有函数字面量,局部函数和对象表达式,因此kotlin的函数可以被嵌套,标签限制的return允许我们从外层函数返回,最重要的一个用途就是从lambda表达式中返回
fun foo(){
val arr = arrayOf(1,2,3)
arr.forEach{
print(it)
if (it == 2) return@forEach//结束的是forEach 会执行print(“end”)
}
print("end")
}