将 Java Map 转换为 Scala Map

我有一个java映射:我想把它转换为scala映射:java.util.Map<SomeObject, java.util.Collection<OtherObject>>Map[SomeObject, Set[OtherObject]]

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

注意:实际上我原来的问题是将谷歌转换为a,但由于这是不可能的,所以我已经拆分了问题。如果您有原始问题的解决方案,我也会接受它作为答案。ArrayListMultimap<SomeObject, OtherObject>MultiMap[SomeObject, OtherObject]


答案 1

编辑:推荐的方式是现在使用和方法:JavaConverters.asScala

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

这样做的好处是,不使用神奇的隐式转换,而是显式调用 ,同时保持干净和一致性。.asScala


JavaConversions的原始答案

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

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

调用将触发从java到scala的隐式转换,然后调用java集合,将其隐式转换为scala集合,然后转换为.mapValuesMapMaptoSetSet

默认情况下,它返回一个可变的 ,您可以获得一个不可变的,其中包含一个额外的 .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))

答案 2

不可变映射myJavaMap.asScala.toMap

可变映射myJavaMap.asScala