for循环

  1. fun main(args: Array<String>) {
  2. print("循环输出:")
  3. for (i in 1..4) print(i) // 输出“1234”
  4. print("设置步长:")
  5. for (i in 1..4 step 2) print(i) // 输出“13”
  6. print("使用 downTo:")
  7. for (i in 4 downTo 1 step 2) print(i) // 输出“42”
  8. // 使用 until 函数排除结束元素
  9. for (i in 1 until 4) { // i in [1, 4) 排除了 4
  10. print(i)
  11. }

迭代遍历

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) 
}