我将 java hashmap 转换为 scala map。我想在迭代时删除该映射中的元素。但我收到此错误:java.lang.UnsupportedOperationException
。这是我的代码。编译时也没有报错。
var smap = mapAsScalaMap(instCreatorConfig.getMap())
var it:Iterator[(String,List[List[String]])]=smap.iterator
while (it.hasNext()) {
var t= it.next()
var k= t._1
var v= t._2
println("Key :"+k)
println("Value :"+v)
it.remove()
}
如果代码是这样的:
for((k,v) <-smap){
...
...
...
smap.remove(k)
}
我收到了java.util.ConcurrentModificationException
。为什么?正确的解决方案是什么?
最佳答案
深入研究mapAsScalaMap
实际上,它返回 JMapWrapper
类型的包装器( source code here ),它提供了 (Scala) Iterator
(扩展 AbstractIterator
),提供 next
的实现和hasNext
.
现在,scala 的 Iterator
特征不包括 remove()
方法,那么 it.remove()
行发生了什么? ,是 Scala 编译器寻找隐式转换,将 Scala 迭代器转换为具有 remove()
的内容。方法 - 并发现 scala.collection.JavaConversions.asJavaIterator
,您几乎肯定在范围内可用,因为您可能只是通过 import scala.collection.JavaConversions._
批量导入了所有 java 转换函数(或类似)。
这个方法,asJavaIterator
,返回 IteratorWrapper
(在 the same source file 中定义)具体定义了 remove()
方法作为抛出 UnsupportedOperationException
.
使用 smap.remove(k)
继续问题的更新部分,这是通过包装 JMapWrapperLike
来处理的通过将调用传递给底层 java 映射,这通常会抛出 ConcurrentModificationException
如果您尝试从 map 中删除条目,请调用 hasNext()
相关的(Java)Iterator
,你有,包裹在 IteratorWrapper
中叫it
.
至于如何解决所有这些问题,首先我需要知道为什么您需要首先删除该条目 - 您想在这里实现什么目标?
关于java - 如何在scala中删除java hashmap的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32806634/