我有一个Java map :java.util.Map<SomeObject, java.util.Collection<OtherObject>>我想将其转换为scala map :Map[SomeObject, Set[OtherObject]]
我使用了 mapAsScalaMap ,但结果不是我想要的,结果是:Map[SomeObject, java.util.Collection[OtherObject]]。我如何解决它也可以将集合转换为集合?

注意:实际上,我最初的问题是将Google的ArrayListMultimap<SomeObject, OtherObject>转换为MultiMap[SomeObject, OtherObject],但是由于这不可能,所以我将问题分解了。如果您有原始问题的解决方案,我也将其作为答案。

最佳答案

编辑:现在推荐的方法是使用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的隐式转换,然后在java集合上调用toSet并隐式将其转换为scala集合,然后再转换为Set

默认情况下,它返回一个可变的Map,您可以使用一个附加的.toMap获得一个不变的ojit_code。

简短示例:
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))

07-28 01:41
查看更多