将Java Map转换为Scala Map

时间:2013-06-04 13:18:18

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

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

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

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

4 个答案:

答案 0 :(得分:61)

修改:现在推荐的方法是使用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

简短的例子:

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))

答案 1 :(得分:1)

如果您必须通过java执行此操作:

List<Tuple2<A, B>> tuples = javaMap.entrySet().stream()
            .map(e -> Tuple2.apply(e.getKey(), e.getValue()))
            .collect(Collectors.toList());

scala.collection.Map scalaMap = scala.collection.Map$.MODULE$.apply(JavaConversions.asScalaBuffer(tuples).toSeq());

基于:https://stackoverflow.com/a/45373345/5209935

答案 2 :(得分:0)

您可以使用以下函数将Java Map转换为Scala Map:

val scalaMap = javaMap.asScala;

要使用此功能,您需要导入导入scala.collection.JavaConverters._库。

希望这有帮助。

答案 3 :(得分:0)

不变的地图 myJavaMap.asScala.toMap

可变地图 myJavaMap.asScala