Scala:在Java到Scala转换后在包装器映射上调用标准方法

时间:2017-05-30 21:00:02

标签: scala

我有两个java映射,它将String映射到一组字符串。

我想将java地图转换为Scala和"添加" map1到map2,如果它们都具有相同的键,则结果映射中的值将是2个值集的并集。我为地图添加找到了一个很好的解决方案:

map1 ++ map2.map { case (k,v) => k -> (v ++ map1.getOrElse(k,v))}

当我通过' asScala'将Java地图转换为Scala时,问题就出现了。呼叫。当我们进行这个对话时,我们得到:

enter image description here

转换为Scala后,我无法再在这些包装器集合上运行上述解决方案。仍然定义了地图上的++操作。但是,SetWrapper类没有定义++操作。据我所知,SetWrapper根本没有定义任何操作!以下是文档的完整定义:

enter image description here

SetWrapper似乎扩展了一个抽象类,并没有定义任何功能。

如何解决此问题?是否有另一个对话步骤到真正的Set对象?

1 个答案:

答案 0 :(得分:2)

JMapWrapper在Scala Map中包装Java Map; SetWrapper将Scala Set包装在Java Set中。所以它有Set的Java方法,而不是Scala的方法。

您不提供类型,但似乎您从java.util.Map[SomeKey, java.util.Set[SomeType]]开始。在其上调用asScala只会转换外部Map,而不是其值。您可以使用javaMap.asScala.mapValues(_.asScala)解决此问题(通常需要注意的是,每次访问值时都会调用asScala;如果不可接受,请使用.map。< / p>