【问题标题】:Kotlin list.map() how to avoid ConcurrentModificationExceptionKotlin list.map() 如何避免 ConcurrentModificationException
【发布时间】:2021-11-23 10:07:13
【问题描述】:

我遇到了 ConcurrentModificationException 的问题。这是我的部分代码:

    var deltaSum = 0
    arrDeltaBrainWaves.map {
         value -> deltaSum += value
   }

说清楚 - 我知道为什么会出现这个错误 :) 问题是 - 我不知道解决方案是什么?我真的需要创建新的临时列表并将值放在那里吗?这只是没有意义:) 请有更好的选择吗?

编辑:

我将代码更改为以下:

var deltaSum = 0
                                with(arrDeltaBrainWaves.iterator()) {
                                    forEach {
                                        deltaSum += it
                                    }
                                }
                                avgDelta = deltaSum / arrDeltaBrainWaves.size

但问题依然存在。

【问题讨论】:

    标签: android list concurrentmodificationexception


    【解决方案1】:

    你需要使用迭代器

    示例:

    val myCollection = mutableListOf(1,2,3,4)
    val iterator = myCollection.iterator()
    while(iterator.hasNext()){
        val item = iterator.next()
        //do something
    }
    

    这将避免 ConcurrentModificationExceptions

    【讨论】:

    • 不幸的是问题仍然存在。请参阅编辑后的帖子。
    • @Bartos 发生此异常的主要原因是您可能有一些修改此数组的代码。只需测试两个项目,让我更新它。首先,将Volatile 添加到您的数组中并在Synchronized 块内运行您的代码。其次,您可以将数组更改为哈希图吗?如果是,这应该可以解决这个异常。
    【解决方案2】:

    使用迭代器可以避免 ConcurrentModificationException。这是 kotlin 的做法:

    with(arrDeltaBrainWaves.iterator()) {
     forEach {
        
     }
    }
    

    【讨论】:

    • 不幸的是问题仍然存在。请参阅编辑后的帖子。
    • 我尝试了代码,但没有看到任何异常。您确定异常是由于此代码 sn-p 引起的吗?你能添加更多你的代码吗?
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2017-05-30
    • 2014-02-25
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多