Scala 2.13错误:重载方法w(带备选项)

irlmq6kh  于 8个月前  发布在  Scala
关注(0)|答案(1)|浏览(71)

我将一些代码从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]     ^

您能解释一下是什么问题吗?

j9per5c4

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|
首先,您必须替换集合转换器的导入。然后,您有以下旧代码

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))
    })

在scala 2.12中,Map.mapValues返回Map

def mapValues[W](f: (V) ⇒ W): Map[K, W]

通过对每个检索到的值应用函数来转换此Map。
Scala 2.13 Map.mapValues返回一个MapView

def mapValues[W](f: (V) => W): MapView[K, W]

通过对每个检索到的值应用函数来转换此Map。已弃用(* 自版本2.13.0*)使用.view.mapValues(f)。未来的版本将包含此方法的严格版本(目前为.view.mapValues(f).toMap)。
这意味着该方法的签名已被更改,并且该方法已被弃用。正如迁移指南和方法的scaladoc中所详述的那样,您应该使用map.view.mapValues(transformation).toMap。在你的代码中应该是这样的

val newMap = scalaMap.view.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))
    }).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进行进一步的阅读
集合有相当多的方法来构造新的集合。例如mapfilter++。我们称这样的方法为transformers,因为它们至少接受一个集合作为接收器对象,并产生另一个集合作为结果。
有两种主要的方法来实现变压器。一个是strict,这是一个新的集合,其所有元素都是作为Transformer的结果构造的。另一种是non-strictlazy,即只为结果集合构造一个代理,其元素只在需要时构造。

相关问题