Scala 2.13错误:发现类型不匹配需要Iterable[String,Double]:java.util.Map[String,Double]

xpcnnkqh  于 2023-08-05  发布在  Scala
关注(0)|答案(1)|浏览(109)

我有一个scala项目需要从scala 2.12迁移到2.13。我有一个简单的代码,可以将scala Map转换为Java.util.Map。我使用asJava方法来实现,代码很简单

val jMap : java.util.Map[String,java.lang.Double]= imputerMap.mapValues(Double.box).asJava

字符串
但我得到一个错误

found   : Iterable[(String, Double)]
[ERROR]  required: java.util.Map[String,Double]
[ERROR]     val jMap : java.util.Map[String,java.lang.Double]= imputerMap.mapValues(Double.box).asJava


scala 2.13的文档中,我看到导入的更改为import scala.jdk.CollectionConverters._,但我没有看到它应该中断,我现在如何进行转换?

cmssoen2

cmssoen21#

正如你已经看到的,从scala 2.12到scala 2.13,scala和java集合之间的转换已经发生了变化:

要启用这些转换,只需从JavaConverters对象导入它们:

import collection.JavaConverters._

字符串

要启用这些转换,请从CollectionConverters对象导入它们:

import scala.jdk.CollectionConverters._


Map类中的方法mapValues的签名也发生了变化:

  • mapValues - scala 2.12
/** Transforms this map by applying a function to every retrieved value.
   *  @param  f   the function used to transform values of this map.
   *  @return a map view which maps every key of this map
   *          to `f(this(key))`. The resulting map wraps the original map without copying any elements.
   */
  override def mapValues[W](f: V => W): Map[K, W]

  • mapValues - scala 2.13(自scala 2.13起已弃用)
/** Transforms this map by applying a function to every retrieved value.
    *  @param  f   the function used to transform values of this map.
    *  @return a map view which maps every key of this map
    *          to `f(this(key))`. The resulting map wraps the original map without copying any elements.
    */
  @deprecated("Use .view.mapValues(f). A future version will include a strict version of this method (for now, .view.mapValues(f).toMap).", "2.13.0")
  def mapValues[W](f: V => W): MapView[K, W]


mapValues返回MapView。您可以在以下链接中找到有关视图的信息

要从一个集合 * 转到它的视图**,可以对集合使用view方法**。如果xs是某个集合,那么xs.view相同的集合,但是所有转换器都是惰性实现的。要将aview* 恢复到astrict collection,可以使用to转换操作,并将严格集合工厂作为参数(例如xs.view.to(List)
因此,您的代码应该重构为

import scala.jdk.CollectionConverters._

val jMap: java.util.Map[String, java.lang.Double] = 
  imputerMap
    .view // use view as the deprecated method suggeted
    .mapValues(Double.box)
    .to(Map) // transform from lazy collection to strict one
    .asJava  // the method to convert to java collection

相关问题