Solución:
Ese es un problema común con la JVM, si desea eliminar un elemento de una colección mientras lo recorre, debe usar los iteradores
ejemplo:
val myCollection = mutableListOf(1,2,3,4)
val iterator = myCollection.iterator()
while(iterator.hasNext()){
val item = iterator.next()
if(item == 3){
iterator.remove()
}
}
esto evitará ConcurrentModificationExceptions
Espero que esto responda a tu pregunta, que tengas un buen día.
Editar: puede encontrar otra explicación aquí, incluso si es código Java, el problema es el mismo
Editar n ° 2 la respuesta de leonardkraemer le muestra una forma más amigable con Kotlin de hacerlo
En Kotlin puedes usar removeIf{ predicate }
. Que es una forma abreviada de usar el Iterator
. Declaración completa:
listAccounts.removeIf{ it == account.id }
para obtener una explicación, consulte Iterando a través de una colección, evitando ConcurrentModificationException al eliminar objetos en un bucle
Actualizar: Kotlin-stdlib introducido removeAll { predicate }
que, como señaló Aguragorn en su respuesta, hace lo mismo y puede usarse si removeIf
no está presente en su entorno de ejecución (es decir, Java 1.6 o Android pre API nivel 24).
with(listAccounts.iterator()) {
forEach {
if (it.id == someObj.id) {
// do some stuff with it
oldSubscription = it
remove()
}
}
}
Misma solución que SeekDaSky pero más Kotlin’y