将Java Map转换为Scala Map

50
我有一个Java Map:java.util.Map<SomeObject, java.util.Collection<OtherObject>>,我想将它转换为Scala Map:Map[SomeObject, Set[OtherObject]]
我已经使用了 mapAsScalaMap 但结果并不是我想要的,结果是:Map[SomeObject, java.util.Collection[OtherObject]]。如何修复它以便也将集合转换为Set?
注意:实际上我的原始问题是将Google的ArrayListMultimap<SomeObject, OtherObject>转换为MultiMap[SomeObject, OtherObject],但由于这是不可能的,因此我将问题分解了。如果您有原始问题的解决方案,我也会接受它作为答案。

请查看此帖子:https://dev59.com/23A75IYBdhLWcg3wv70j - Luther Blissett
以及此页面:http://www.scala-lang.org/docu/files/collections-api/collections_46.html - Luther Blissett
@LutherBlisset:它与mapAsScalaMap具有相同的结果:Map [SomeObject,java.util.Collection [OtherObject]]。 - user365268
@LutherBlisset:此外,文档页面没有提到关于嵌套类型的转换。我尝试将其转换为Map [SomeObject,Iterable [OtherObject]],因为Collection会自动转换为Iterable,但我得到了与之前相同的结果。 - user365268
4个回答

70

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

import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)

使用 JavaConversions 会隐式地在 Java 和 Scala 之间进行转换,但是有时候使用 .asScala 方法进行显式调用可以更清晰和简明。

import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toSet)

调用mapValues会触发从Java Map到Scala Map的隐式转换,然后在Java集合上调用toSet将其隐式转换为Scala集合,最后再转换为Set

默认情况下,它返回一个可变的Map,您可以通过额外的.toMap获取一个不可变的Map

简短的例子:

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)”这一部分。 - user365268
2
@Ha11owed 人们推荐转换器:https://dev59.com/92sy5IYBdhLWcg3w0RM5 和评论到 http://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html - som-snytt

5

不可变 Map myJavaMap.asScala.toMap

可变 Map myJavaMap.asScala


2

如果您需要使用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://dev59.com/FGct5IYBdhLWcg3wqvXL#45373345

这篇文章讨论了如何使用CSS来实现在鼠标悬停时显示隐藏的元素。具体来说,它介绍了:hover伪类和display属性的结合使用,以及如何在HTML中设置样式。此外,还讨论了如何在不同浏览器中正确地应用该技术。

1
您可以使用以下函数将Java Map转换为Scala Map:
val scalaMap = javaMap.asScala;

为了使用这个,你需要导入import scala.collection.JavaConverters._库。 希望这可以帮助你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接