java - 如何在scala中删除java hashmap的元素?

标签 java scala

我将 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/

相关文章:

java - Gradle scala 类已通过组合 Java 编译定义

java - Scala.List 和 Java.util.List 之间的互操作

generics - 计算 Scala 泛型类 'equals' 方法中的类型参数... list 是唯一的方法吗?

java - BinarySearch 不会结束

java - Java 正则表达式语法的 ANTLR 语法

java - 保存序列化的 ArrayList 在 Android 中抛出 NotSerializableException

Scalaz Bind[Seq] 类型类

scala - 如何在 sbt 子项目构建文件中启用插件?

java - NOOP 在 JOOQ 哪里

java - 让客户端监听服务器