相关疑难解决方法(0)

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

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>
Run Code Online (Sandbox Code Playgroud)

你做不到Map.empty ++ javaMap,因为++方法不了解Java地图.我试过了:

scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
    override def underlying = javaMap
}
Run Code Online (Sandbox Code Playgroud)

和:

scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
    override def underlying = javaMap
  }
Run Code Online (Sandbox Code Playgroud)

这些都无法编译,因为泛型 - java.lang.String与scala String不同.

有没有一种好方法可以做到这一点,而不是手动复制地图?

编辑:谢谢,所有好的答案,我从他们所有人那里学到了很多东西.但是,我在这里发布一个比我实际拥有的更简单的问题犯了一个错误.所以,如果你允许我,我会概括一个问题 - API实际返回的是什么

java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
Run Code Online (Sandbox Code Playgroud)

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

它似乎不太复杂,但它增加了额外级别的类型擦除,我发现将其移动到Scala地图的唯一方法是深度复制它(使用下面建议的一些技术) .任何提示?我通过为我的确切类型定义一个隐式转换来解决我的问题,所以至少丑陋隐藏在它自己的特性中,但仍然感觉有点笨拙的深层复制.

scala map language-interoperability scala-collections

14
推荐指数
3
解决办法
1万
查看次数