Scala:在Java到Scala转换后调用包装映射上的标准方法
我有两个java映射,它们将一个字符串映射到一组字符串 我想将java映射转换为Scala,并将map1“添加”到map2,这样,如果它们都具有相同的键,那么结果映射中的值将是两个值集的并集。我找到了一个很好的地图添加解决方案:Scala:在Java到Scala转换后调用包装映射上的标准方法,scala,Scala,我有两个java映射,它们将一个字符串映射到一组字符串 我想将java映射转换为Scala,并将map1“添加”到map2,这样,如果它们都具有相同的键,那么结果映射中的值将是两个值集的并集。我找到了一个很好的地图添加解决方案: map1 ++ map2.map { case (k,v) => k -> (v ++ map1.getOrElse(k,v))} 当我通过'asScala'调用将java映射转换为Scala时,就会出现这个问题。当我们进行此对话时,我们得到: 在转换到
map1 ++ map2.map { case (k,v) => k -> (v ++ map1.getOrElse(k,v))}
当我通过'asScala'调用将java映射转换为Scala时,就会出现这个问题。当我们进行此对话时,我们得到:
在转换到Scala之后,我不再能够在这些包装器集合上运行上面的解决方案。映射上的++操作仍在定义中。但是,SetWrapper类没有定义++操作。据我所知,SetWrapper根本没有定义任何操作!以下是文档中的完整定义:
SetWrapper似乎扩展了一个抽象类,并且没有定义任何功能
我怎样才能避开这个问题?是否还有另一个对话步骤指向真正的Set对象?
JMapWrapper
将JavaMap
包装在ScalaMap
中SetWrapper
将ScalaSet
封装在JavaSet
中。所以它有Java的Set
方法,而不是Scala的
您没有提供类型,但似乎是从java.util.Map[SomeKey,java.util.Set[SomeType]]
开始的。对其调用asScala
,只会转换外部映射
,而不会转换其值。您可以通过使用javaMap.asScala.mapValues(u.asScala)
(通常的警告是,每次访问值时它都会调用asScala
;如果不可接受,则使用.map
)