将 Java 映射转换为 Scala 映射
Posted
技术标签:
【中文标题】将 Java 映射转换为 Scala 映射【英文标题】:Convert Java Map to Scala Map 【发布时间】:2013-05-30 21:58:03 【问题描述】:我有一个 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]
但由于这是不可能的,我已经解决了问题。如果您对原始问题有解决方案,我也将接受它作为答案。
【问题讨论】:
看这个帖子:***.com/questions/3127238/… 和这个页面:scala-lang.org/docu/files/collections-api/collections_46.html @LutherBlisset:它与 mapAsScalaMap 的结果相同:Map[SomeObject, java.util.Collection[OtherObject]] @LutherBlisset:此外,文档页面没有说明嵌套类型的转换。我尝试将其转换为 Map[SomeObject, Iterable[OtherObject]],因为 Collection 会自动转换为 Iterable,但我得到的结果与以前相同。 【参考方案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))
【讨论】:
谢谢,我错过了“mapValues(_.toSet)”部分 @Ha11owed 人们推荐转换器:***.com/questions/8301947/… 和 cmets 到 docs.scala-lang.org/overviews/collections/…【参考方案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://***.com/a/45373345/5209935
【讨论】:
以上是关于将 Java 映射转换为 Scala 映射的主要内容,如果未能解决你的问题,请参考以下文章
在 spark 和 scala 中,如何将数据框转换或映射到特定列信息?