我想知道.indices究竟是如何工作的,这两个for循环之间的主要区别是什么。
for (arg in args)
println(arg)
或
for (i in args.indices)
println(args[i])
withIndex()
函数
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
答案 0 :(得分:5)
这些只是迭代数组的不同方法,具体取决于您在for
循环体内需要访问的内容:当前元素(第一种情况),当前索引(第二种情况)或两者(第三种情况)。
如果你想知道它们是如何工作的,你可以跳转到Kotlin运行时的代码(IntelliJ中的 Ctrl + B ) ,并找出答案。
对于indices
具体而言,这很简单,它实现为extension property,返回IntRange
for
循环可以迭代:
/**
* Returns the range of valid indices for the array.
*/
public val <T> Array<out T>.indices: IntRange
get() = IntRange(0, lastIndex)
答案 1 :(得分:2)
答案 2 :(得分:0)
indices
返回集合的IntRange
(从第一个位置到最后一个位置的索引范围),例如:
val array= arrayOf(10,20,30,40,50,60,70)
println("Indices: "+array.indices) // output: Indices: 0..6
在问题中,两个循环都在做相同的事情,并且以不同的方式迭代任何集合(如@ zsmb13所述),但是,第二个for循环不会像第一个那样创建迭代器对象。
indices
返回IntRange
,因此您必须检查IntRange
的{{3}}有用方法
答案 3 :(得分:0)
我写的时候
for (i in 0..searchResultsTemp.items.size-1 )
{ " la-la-la "},
我想处理集合的每个项目,但我不会使用 forEach 运算符,我可以访问集合项目的索引。 然后内置的Android Studio helper 建议我自动将这个表达式替换为
for (i in searchResultsTemp.items.indices)
{ " la-la-la "}
是一样的。