【问题标题】:Convert Java Map to Scala Map将 Java 映射转换为 Scala 映射
【发布时间】:2013-05-30 21:58:03
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

编辑:现在推荐的方法是使用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))

【讨论】:

【解决方案2】:

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

val scalaMap = javaMap.asScala;

要使用它,您需要导入 import scala.collection.JavaConverters._ 库。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    不可变映射 myJavaMap.asScala.toMap

    可变地图 myJavaMap.asScala

    【讨论】:

      【解决方案4】:

      如果您必须从 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 2017-03-10
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        相关资源
        最近更新 更多