我将一些代码从2.12迁移到了scala 2.13,我有以下代码
def w(value : java.util.Map[String, java.util.List[String]]) : ParamPair[Map[String, (String, String)]] = {
val scalaMap = value.asScala.toMap
val newMap = scalaMap.mapValues[(String, String)]( (l : java.util.List[String]) => {
if(l.size() != 2)
throw new IllegalArgumentException("A tuple map should contain exactly 2 elements ")
val lScala = l.asScala.toArray
(lScala(0), lScala(1))
})
w(newMap)
}
在最后一行我得到错误
error: overloaded method w with alternatives:
[ERROR] (value: java.util.Map[String,java.util.List[String]])org.apache.spark.ml.param.ParamPair[Map[String,(String, String)]] <and>
[ERROR] (value: Map[String,(String, String)])org.apache.spark.ml.param.ParamPair[Map[String,(String, String)]]
[ERROR] cannot be applied to (scala.collection.MapView[String,(String, String)])
[ERROR] w(newMap)
[ERROR] ^
您能解释一下是什么问题吗?
1条答案
按热度按时间j9per5c41#
scala 2.13中引入了一些突破性的集合变化。这里有Scala 2.13中集合的迁移指南
有哪些突破性的变化?
collection.JavaConversions
。请使用scala.jdk.CollectionConverters
。以前的建议是使用collection.JavaConverters
,现在已弃用| 描述|旧代码|新代码|自动迁移规则|
| --|--|--|--|
| mapValues和filterKeys现在返回MapView而不是Map|
kvs.mapValues(f)
|kvs.mapValues(f).toMap
| RoughlyMapValues|首先,您必须替换集合转换器的导入。然后,您有以下旧代码
在scala 2.12中,Map.mapValues返回
Map
。通过对每个检索到的值应用函数来转换此Map。
Scala 2.13 Map.mapValues返回一个
MapView
。通过对每个检索到的值应用函数来转换此Map。已弃用(* 自版本2.13.0*)使用
.view.mapValues(f)
。未来的版本将包含此方法的严格版本(目前为.view.mapValues(f).toMap
)。这意味着该方法的签名已被更改,并且该方法已被弃用。正如迁移指南和方法的scaladoc中所详述的那样,您应该使用
map.view.mapValues(transformation).toMap
。在你的代码中应该是这样的最后一行
(lScala(0), lScala(1))
是Tuple2[String,String]
,使newMap
的类型为Map[String, (String, String)]
。在下一行中,您正在调用w
函数,该函数需要java.util.Map[String, java.util.List[String]]
。执行newMap.asJava
将返回util.Map[String, (String, String)]
。您可以使用Views进行进一步的阅读
集合有相当多的方法来构造新的集合。例如
map
、filter
或++
。我们称这样的方法为transformers,因为它们至少接受一个集合作为接收器对象,并产生另一个集合作为结果。有两种主要的方法来实现变压器。一个是
strict
,这是一个新的集合,其所有元素都是作为Transformer的结果构造的。另一种是non-strict
或lazy
,即只为结果集合构造一个代理,其元素只在需要时构造。