scala - 如何从 java.util.Map 转换为 Scala Map

标签 scala map scala-collections language-interoperability

Java API 返回 java.util.Map<java.lang.String,java.lang.Boolean> ;.我想把它放入 Map[String,Boolean]
所以想象我们有:

var scalaMap : Map[String,Boolean] = Map.empty
val javaMap = new JavaClass().map()   // Returns java.util.Map<java.lang.String,java.lang.Boolean>

你做不到Map.empty ++ javaMap ,因为++ 方法不知道 Java 映射。我试过:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
    override def underlying = javaMap
}

和:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
    override def underlying = javaMap
  }

由于泛型,这些都无法编译 - java.lang.String与 Scala 字符串不同。

除了手动复制 map 之外,是否有一种很好的方法可以做到这一点?

编辑:谢谢,所有好的答案,我从他们那里学到了很多东西。但是,我在这里发布了一个比我实际遇到的问题更简单的问题,这是一个错误。所以,如果你允许我,我会概括这个问题 - API 实际返回的是
java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>

我需要将它移动到 Map[String, Map[SomeJavaEnum,String]]

它可能看起来并不复杂,但它增加了额外的类型删除级别,我发现将其移动到 Scala 映射的唯一方法是深度复制它(使用您在下面建议的一些技术) .有人有任何提示吗?我通过为我的确切类型定义隐式转换来解决我的问题,所以至少丑陋隐藏在它自己的特征中,但仍然感觉有点笨拙,深度复制很多。

最佳答案

至少在 Scala 2.9.2 中,集合转换有一种更简单的方法:导入“import collection.JavaConversions._”并使用“toMap”。

例子:

// show with Java Map:

scala> import java.util.{Map=>JMap}
scala> val jenv: JMap[String,String] = System.getenv()
jenv: java.util.Map[String,String] = {TERM=xterm, ANT_OPTS=-Xmx512m ...}

scala> jenv.keySet()
res1: java.util.Set[String] = [TERM, ANT_OPTS...]

// Now with Scala Map:

scala> import collection.JavaConversions._
scala> val env: Map[String,String] = System.getenv.toMap // <--- TADA <---
env: Map[String,String] = Map(ANT_OPTS -> -Xmx512m, TERM -> xterm ...)

// Just to prove it's got Scala functionality:

scala> env.filterKeys(_.indexOf("TERM")>=0)
res6: scala.collection.immutable.Map[String,String] = Map(TERM -> xterm, 
  TERM_PROGRAM -> iTerm.app, ITERM_PROFILE -> Default)

它适用于字符串到 bool 值的 java.util.map。

关于scala - 如何从 java.util.Map 转换为 Scala Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1027868/

相关文章:

scala - Scala 中的树集合

Scala 的 "This"和 MapLike

scala - 使用Scala打印列表中的第一个元素

Scala 类型(推理)问题?

scala - 模式匹配 java.lang.Long

Scala: "Genericising"超过单例类型?

c++ - 广泛使用OpenGL绘制世界地图[WGS84]

scala - 如何在不使用 var 的情况下定义 count

perl - 我可以将 Perl 的映射与数组切片一起使用吗?

C++:使用 clang 编译以迭代器作为值的映射时出现巨大错误