如何转换Java地图以便在Scala中使用?

Sam*_*iel 5 java scala type-conversion scala-java-interop

我正在研究Scala程序,该程序从Java库调用函数,处理结果并吐出CSV.

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

    Map<String, Map<String, AtomicLong>> getData();
Run Code Online (Sandbox Code Playgroud)

斯卡拉:

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

错误:

    type mismatch;
    found:java.util.Map[java...String,java...Map[java...String,java...AtomicLong]]
    required: scala...Map[String,scala...Map[String,java...AtomicLong]]
Run Code Online (Sandbox Code Playgroud)

(路径名称破坏了格式.)

我猜测JavaConversions可以成功转换外部java ... Map而不是内部java ... Map.我看到了这个问题,但我不确定如何编写"显式隐式转换".

gou*_*ama 8

编辑:推荐的方法是使用JavaConverters.asScala方法:

import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala)
Run Code Online (Sandbox Code Playgroud)

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


原答案JavaConversions:

简短的回答是:调用.mapValues外部地图来转换内部地图:

import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toMap)
Run Code Online (Sandbox Code Playgroud)

.mapValues强制转换或外部地图为scala Map.toMap强制将内部地图转换为scala(不可变)地图.不可变部分并非绝对必要,但无论如何......

这与这个anwser非常相似.简短的例子:

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()
Run Code Online (Sandbox Code Playgroud)