java - 将 Java 映射转换为 Scala 映射

标签 java scala type-conversion scala-collections scala-java-interop

我有一个 java map :java.util.Map<SomeObject, java.util.Collection<OtherObject>> 我想将其转换为 scala map :Map[SomeObject, Set[OtherObject]]

我用过 ma​​pAsScalaMap 但结果不是我想要的,结果是:Map[SomeObject, java.util.Collection[OtherObject]] .如何修复它以将集合转换为集合?

注意:实际上我最初的问题是转换 google 的 ArrayListMultimap<SomeObject, OtherObject>MultiMap[SomeObject, OtherObject]但由于这是不可能的,我已经解决了这个问题。如果您对原始问题有解决方案,我也将接受它作为答案。

最佳答案

Edit:现在推荐的方法是使用 JavaConverters.asScala 方法:

import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)

这样做的好处是不使用神奇的隐式转换,而是显式调用 .asScala,同时保持简洁。


JavaConversions的原始答案:

您可以使用 scala.collection.JavaConversions 在 Java 和 Scala 之间进行隐式转换:

import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toSet)

调用 mapValues 会触发从 java Map 到 scala Map 的隐式转换,然后调用 toSet 在 java 集合上,将其隐式转换为 scala 集合,然后转换为 Set

默认情况下,它返回一个可变的Map,你可以通过额外的.toMap得到一个不可变的。

简短的例子:

scala> val a: java.util.Map[String, java.util.Collection[String]] = new java.util.HashMap[String, java.util.Collection[String]]
a: java.util.Map[String,java.util.Collection[String]] = {}

scala> val b = new java.util.ArrayList[String]
b: java.util.ArrayList[String] = []

scala> b.add("hi")
res5: Boolean = true

scala> a.put("a", b)
res6: java.util.Collection[String] = []

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val c = a.mapValues(_.toSet)
c: scala.collection.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi))

scala> c.toMap
res7: scala.collection.immutable.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi))

关于java - 将 Java 映射转换为 Scala 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16918956/

相关文章:

java - 制作对象数组

scala - 为什么Scala不能绑定(bind)通配符类型参数?

scala - 如何通过 SBT 将本地缓存的 jar 复制到文件夹?

c - 如何构建一个类型以传递给一个 DLL 函数,该函数采用指向内部数组的结构的指针?

java - 工作线程在 Netty 中被阻塞

java - 加载并显示文件夹中的所有图像

java - 使用 Enum 来检查条件

scala - 将 Spark DataFrame 保存到具有 map<string,string> 列类型的 csv 文件

Mysql 将 double 或 int 转换为日期或月份

string - Julia : How to convert vector of type string to type numeric (Float64)