我在 Kotlin 中有两个相同大小的列表,foodObjects: MutableList<ParseObject>?
和 checked: MutableList<Boolean>?
.我需要做一个 for
循环并得到 objectId
来自 foodObjects
每次 checked
的一个元素是真的。所以在 Java 中是这样的:
for (int i = 0; i < foodObjects.size(); i++) {
// here
}
但是在Kotlin中,不知道为什么,出现了一些问题。事实上,如果我这样做:
for (i in 0..foodObjects!!.size) {
if (checked?.get(i) == true) {
objectsId?.add(foodObjects.get(i).objectId)
}
}
我有 IndexOutOfBoundsException
.我不知道为什么,它还在 foodObjects.size
继续循环.我也可以用 filter
来做和 map
:
(0..foodObjects!!.size)
.filter { checked?.get(it) == true }
.forEach { objectsId?.add(foodObjects.get(it).objectId) }
但我遇到了同样的错误。我用它来停止错误并让它工作:
for (i in 0..foodObjects!!.size) {
if (i < foodObjects.size) {
if (checked?.get(i) == true) {
objectsId?.add(foodObjects.get(i).objectId)
}
}
}
每个人都可以告诉我为什么在 Kotlin 中我需要这样做,而在 Java 中它却能很好地工作?
最佳答案
Kotlin 中的范围是包容性的,因此 0..foodObjects!!.size
从 0
开始到 foodObjects.size
结束,包括两端。当您的循环尝试使用自己的大小(比最大有效索引多一个)索引列表时,这会导致异常。
要创建不包括上限的范围(如您的 Java 循环),您可以使用 until
:
for(i in 0 until foodObjects!!.size) {
// ...
}
如果您对预先使用的集合进行空检查,您还可以稍微清理一下代码:
if (foodObjects != null && checked != null && objectsId != null) {
for (i in 0 until foodObjects.size) {
if (checked.get(i) == true) {
objectsId.add(foodObjects.get(i).objectId)
}
}
}
else {
// handle the case when one of the lists is null
}
为了完全摆脱必须处理索引的麻烦,您可以使用 indices
列表的属性(另外我在这里使用索引运算符而不是 get
调用):
for (i in foodObjects.indices) {
if (checked[i]) {
objectsId.add(foodObjects[i].objectId)
}
}
你也可以使用 forEachIndexed
:
foodObjects.forEachIndexed { i, foodObject ->
if (checked[i]) {
objectsId.add(foodObject.objectId)
}
}
关于java - Kotlin 中 for 循环的 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45321344/