for循环
fun main(args: Array<String>) {print("循环输出:")for (i in 1..4) print(i) // 输出“1234”print("设置步长:")for (i in 1..4 step 2) print(i) // 输出“13”print("使用 downTo:")for (i in 4 downTo 1 step 2) print(i) // 输出“42”// 使用 until 函数排除结束元素for (i in 1 until 4) { // i in [1, 4) 排除了 4print(i)}
迭代遍历
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
通过索引进行遍历
for (index in items.indices) {
println(tems[index])
}
注:items.indices的作用是获得数组的索引值的区间,比如数组共有10个元素,则indices返回的区间为 [0,10)
Java
for (int i = 1; i < 11 ; i++) { }
for (int i = 1; i < 11 ; i+=2) { }
for (String item : collection) { }
for (Map.Entry<String, String> entry: map.entrySet()) { }
Kotlin
for (i in 1 until 11) { }
for (i in 1..10 step 2) {}
for (item in collection) {}
for ((index, item) in collection.withIndex()) {}
for ((key, value) in map) {}
利用标签退出外部循环
loop@ for (j in 0..10) {
for (i in j..10) {
if (i==5&&j == 5) {
println("当外层值为 $j 内层值为$i, 使用break标签 跳出循环")
break@loop
} else {
println("当外层值为 $j 内层值为$i,使用continue标签继续下一次循环")
continue@loop
}
}
}
while 及do…while循环
和Java没啥不同,这边不赘述。
顺带一提: break,continue,return也没啥不同,正常应用
标签也基本一致:
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}
注:作用为跳出外循环
if 表达式
- 基本使用与Java一致
- 不同的是在Kotlin里我们可以把表达式的结果赋给变量:
如:
var max: Int
if (a > b) {
max = a
} else {
max = b
}
我们可以直接修改为:
val max = if (a > b) a else b
或者赋值的同时顺便打一下日志:
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
由于语法糖,我们可以判断一个数字的所在区间:
val x = 2
if (x in 1..8) {
println("x 在区间内")
}
when表达式(其实就是默认加了break的switch)
when(num){
1 -> print("情况1")
0,2-> {
print("情况0或情况2")
print("在需要执行多行的情况需要加{}")
}
else -> print("其实就是switch里的defnumult")}
when(num){
in 1..5 -> print("这个数字在1~5之间")
//这里的范围可以直接改成一个数组,判断该变量是否存在数组中
in 6..10 -> print("这个数字在6~10之间")
!in 11..50 -> print("这个数字不在11到50之间")
else -> print("其他情况")
}
当我们在使用when,并且不提供参数,when直接可以当做if..,else…使用
when{
isGoodMan() -> print("这是一个好人")
isLazyMan() -> print("这个一个懒人")
}
也可以配合函数使用
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")//由于类型已经被强制转换为String,所以可以直接调用String的方法
else -> false
}
异常捕捉
- try…catch…finally…基本使用方法和Java一致
- 不一样的地方在于(摘自官方文档):
可以有零到多个 catch 块。finally 块可以省略。但是 catch 与 finally 块至少应该存在一个。
try…catch是一个表达式,和if的改变相似,可以直接进行赋值,如下
val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }
注:如果正常执行parInt(input),则a = parseInt(input),否则(异常) a = null;
主动抛出异常:
- 异常可以作为表达式使用
val s = person.name ?: throw IllegalArgumentException("Name required")
注:当person.name == null时抛出异常
- throw 表达式的类型是特殊类型 Nothing 。该类型没有值,只是用于标记永远不能达到的代码位置。 在你自己的代码中,你可以使用Nothing 来标记一个永远不会返回的函数:
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
