如何将 Java 地图转换为在 Scala 中使用?

2024-05-16

我正在开发一个 Scala 程序,该程序调用 Java 库中的函数、处理结果并生成 CSV。

有问题的 Java 函数如下所示:

    Map<String, Map<String, AtomicLong>> getData();

斯卡拉:

    import scala.collection.JavaConversions._
    def analysisAndCsvStuff(data: Map[String, Map[String, AtomicLong]]): Unit { ... }

错误:

    type mismatch;
    found:java.util.Map[java...String,java...Map[java...String,java...AtomicLong]]
    required: scala...Map[String,scala...Map[String,java...AtomicLong]]

(路径名破坏了格式。)

我猜测 JavaConversions 可以成功转换外部 java...Map,但不能成功转换内部 java...Map。我看见这个问题 https://stackoverflow.com/questions/6573414/how-to-convert-java-map-to-scala-map-of-type-linkedhashmapstring-arrayliststri但我不确定如何编写“显式隐式转换”。


Edit: the 推荐方式 https://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala是使用JavaConverters.asScala method:

import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala)

请注意,您将从中获得可变映射。您可以随时使用.asScala.toMap如果你想要不可变的。


原来的答案是JavaConversions:

简短的答案是:打电话.mapValues在外部地图上转换内部地图:

import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toMap)

.mapValues强制将外部映射转换为 scalaMap and .toMap强制将内部映射转换为 scala (不可变的) 地图。不可变的部分并不是绝对必要的,但无论如何......

这非常类似于这个答案 https://stackoverflow.com/a/16920087/738138。简短的例子:

scala> val a: java.util.Map[String, java.util.Map[String, String]] = new java.util.HashMap[String, java.util.Map[String, String]]
a: java.util.Map[String,java.util.Map[String,String]] = {}


scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val myScalaMap = a.mapValues(_.toMap)
myScalaMap: scala.collection.Map[String,scala.collection.immutable.Map[String,String]] = Map()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Java 地图转换为在 Scala 中使用? 的相关文章

随机推荐