首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免ConcurrentModificationException kotlin

如何避免ConcurrentModificationException kotlin
EN

Stack Overflow用户
提问于 2018-04-25 22:06:37
回答 11查看 35.7K关注 0票数 58

我有一个帐户列表,当我进行长时间单击时,我想从列列表中删除该项目。我试图从一个警报对话框中删除它,但是我得到了ConcurrentModificationException。这就是崩溃的地方:

代码语言:javascript
运行
复制
listAccounts.forEachIndexed { index, account ->
    if (idParamether == account.id) {
        listAccounts.remove(account)
    }
}
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2018-04-25 22:20:54

这是JVM的一个常见问题,如果您想在迭代集合时从集合中删除一个项,则需要使用迭代器

例:

代码语言:javascript
运行
复制
val myCollection = mutableListOf(1,2,3,4)
val iterator = myCollection.iterator()
while(iterator.hasNext()){
    val item = iterator.next()
    if(item == 3){
        iterator.remove()
    }
}

这将避免ConcurrentModificationExceptions

我希望这回答了你的问题,祝你今天愉快。

编辑:您可以找到另一个解释,即使是这里代码,问题也是一样的

编辑n°2,leonardkraemer的作者,向您展示了一种更友好的方法。

票数 60
EN

Stack Overflow用户

发布于 2018-04-25 22:24:43

在Kotlin,您可以使用removeIf{ predicate }。这是使用Iterator的速记。全文声明:

代码语言:javascript
运行
复制
listAccounts.removeIf{ it == account.id }

有关解释,请参见遍历集合,在循环中删除对象时避免使用ConcurrentModificationException

Update:Kotlin-stdlib引入了removeAll { predicate },正如Aguragorn在他的回答中所指出的那样,它同样可以用于运行时环境中不存在的removeIf (即Java1.6或Android级别24)。

票数 36
EN

Stack Overflow用户

发布于 2018-11-22 17:15:48

代码语言:javascript
运行
复制
with(listAccounts.iterator()) {
    forEach {
        if (it.id == someObj.id) {
            // do some stuff with it
            oldSubscription = it
            remove()
        }
    }
}

与SeekDaSky相同的解,但更多的Kotlin'y

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50032000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档