将Java Map转换为Scala Map

Ha1*_*wed 41 java scala type-conversion scala-java-interop scala-collections

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

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

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

gou*_*ama 63

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

import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)
Run Code Online (Sandbox Code Playgroud)

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


原答案JavaConversions:

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

import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toSet)
Run Code Online (Sandbox Code Playgroud)

调用mapValues将触发从java Map到scala 的隐式转换Map,然后调用toSetjava集合,隐式将其转换为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))
Run Code Online (Sandbox Code Playgroud)

  • @Ha11owed People推荐转换器:http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala和对http://docs.scala-lang的评论.组织/概述/收藏/转换的Java-和斯卡拉 - collections.html间 (2认同)

小智 5

不可变的地图 myJavaMap.asScala.toMap

可变映射 myJavaMap.asScala