Kotlin请开始你的表演——03流程控制篇
流程控制
1、if语句
基本用法在这里就不讲了,讲讲与Java不同的地方。
-
if表达式(替代三目运算符)
简单来说就是if语句可以有返回值了,例如:
var a: Int = 10 var b: Int = 11 var max = if (a > b) a else b
别忘了,if语句是支持代码块的,所以我们还可以在返回值之前进行某些操作,只要保证返回值在代码块最后一行代码即可:
var max2 = if (a > b) { println("a比b大") a } else { println("b大于或等于a") b }
注:if作为表达式进行赋值时,必须搭配else语句块一起使用。
2、when语句
when语句的出现,纯粹是为了替代switch,并且提供更多的功能。我们依旧通过一个简单的例子来了解:
//通过数字值打印A-D字母
var num = 1
when(num){
0 -> println("A")
1 -> println("B")
2 -> println("C")
else -> println("D")
}
//结果:打印B
想必如果换成switch语句也是so easy.但是如果我们需要将对应的字母暂时先存储起来在之后使用,那么switch语句必定是需要在语句前定义一个变量,在case里为该变量赋值。而when就不必那么麻烦,因为它如if表达式一样也支持返回值和代码块:
-
when表达式
var numStr = when (num) { 0 -> { println("A") "A" } 1 -> { println("B") "B" } 2 -> { println("C") "C" } else -> { println("D") "D" } } println(numStr) //打印B
注:跟if语句一样when表达式也需要else语句搭配使用,但除非编译器可以证明分支条件已经覆盖所有可能性,此时是可以省略else语句的,例如下面使用枚举的例子:
/** * 枚举类,只有4个枚举对象 * */ enum class MyEnum(val num: Int) { A(0), B(1), C(2), D(3) }
此时的when表达式,只要考虑到以上4个枚举对象,就可以不使用else语句:
var mEnum: MyEnum = MyEnum.B var enumStr = when (mEnum) { MyEnum.A -> "A" MyEnum.B -> "B" MyEnum.C -> "C" MyEnum.D -> "D" } println(enumStr)
3、for语句
Kotlin的for循环语句与Java想比精简了不少,通过下面例子大家体会下:
var arr = arrayOf(1,2,3,4,5)
//直接获取item
for (item in arr) {
println(item)
}
//通过索引获取item
for (index in arr.indices) {
println(arr[index])
}
//即获取对象,又获取索引
for ((index, item) in arr.withIndex()) {
println("$index :: $item")
}
并且只要数据类型是支持迭代器的,那么都可以使用这种for语句进行遍历数据。
4、while和do...while语句
while与do...while语句与Java相同,就先一笔带过_
var arr = arrayOf(1, 2, 3, 4, 5)
var index = 0
while (index < arr.size) {
println(arr[index])
index++
}
var index2 = 0
do {
println(arr[index2])
index2++
} while (index2 < arr.size)
5、break\continue\return语句&标签跳转
这3条语句的基本用法以及语义在Kotlin中与其它语言一样:
break : 结束最近的闭合循环
continue : 跳到最近的闭合循环的下次循环
return : 退出当前函数
我们还是来聊聊不同点,Kotlin中支持标签跳转(有点类似C语言的goto语句,但必须配合以上三条语句一起使用)。我们模拟一个三维数组,该数组中有3个数字88,而每个维度里只有一个数字88,让我们把这3个数的索引找出来:
//三维数组
var arr = arrayOf(
arrayOf(arrayOf(1, 2, 3), arrayOf(1, 88, 3), arrayOf(1, 2, 3)),
arrayOf(arrayOf(1, 2, 3), arrayOf(1, 2, 3), arrayOf(1, 88, 3)),
arrayOf(arrayOf(1, 88, 3), arrayOf(1, 2, 3), arrayOf(1, 2, 3))
)
next@ for ((i, item) in arr.withIndex()) {
for ((j, item2) in item.withIndex()) {
for ((k, item3) in item2.withIndex()) {
if (item3 == 88) {
println("($i , $j , $k)")
continue@next
}
}
}
}
打印:
(0 , 1 , 1)
(1 , 2 , 1)
(2 , 0 , 1)
我们通过穷举来暴力查询这3个数,每当查到其中一个,就通过continue语句跳转到标签next@所在位置,并进行下次循环(当然如果我们使用break就会直接退出标签next@所在位置的for循环)。
return语句搭配标签的使用场景,多半是在嵌套函数和lambda表达式中使用,等到对应篇章时再细聊。
到此,Kotlin中流程控制相关的知识点也总结完毕,如有遗漏或错误,欢迎指正。