0%

Kotlin常用的8种循环遍历方法

本篇文章整理一下Kotlin常用的循环遍历写法。

我们经常会使用以下方法进行遍历。

for(i in 0..args.size - 1) {
    println(args[i])
}

Tips: Koltin可以通过调用kotlin.ranges包中的rangeTo()函数及其操作符形式的..轻松的创建两个值的区间。通常rangTo会辅以in或者!in函数。整数类型区间(IntRange、LongRange、CharRange)还有一个拓展特性:可以对对其进行迭代。这些区间也是相应类型的等差数列。这种区间通常用于for循环中迭代。要反向迭代数字,使用downTo函数。也可以通过任意步长(不一定为1)迭代数字,通过step完成。 要迭代不包含其结束元素的数字区间(左闭右开区间),使用until函数。

for (i in 1..4) { //等同于1 <= i && i <= 4
    print(i)
}

for (i in 4 downTo 1) print(i) //输出结果:4321

for (i in 1..8 step 2) print(i) //输出:1357

for (i in 1 until 10) { // i in [1, 10), 10被排除
    print(i)
}

但是Array有一个可读性更强的扩展属性lastIndex。上边的循环可以写成这样:

for(i in 0..args.lastIndex) {
    println(args[i])
}

实际上我们不需要知道最后一个索引,有一个更简单的写法:

for(i in 0 until args.szie) {
    println(args[i])
}

当然也可以使用下标扩展属性indices得到他的范围,indices是一个IntRange类型的值:

for (i in args.indices) {
    println(args[i])
}

还有一个更加直接的写法,通过下边的方式直接迭代集合:

for (arg in args) {
    println(arg)
}

或者还可以使用forEach函数,传递一个lambda表达式来处理每个元素:

args.forEach { arg ->
    println(arg)
}

在上边这些例子中,都增加一个索引变量,并在循环中通过索引获取元素。但是如果我们迭代的是List,最后两个例子底层使用iterator,而其他的例子仍是通过索引获取元素。最后的两个遍历方法:
withIndex函数,他返回一个Iterable对象,该对象可以被解构为当前索引和元素:

for ((index,arg) in args.withIndex()) {
    println("$index: $arg")
}

forEachIndexed函数,他为每个索引和参数提供了一个lambda表达式:

args.forEachIndexed { index, arg ->  
    println("$index: $arg")
}