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.我看到了这个问题,但我不确定如何编写"显式隐式转换".
编辑:推荐的方法是使用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)
| 归档时间: |
|
| 查看次数: |
3443 次 |
| 最近记录: |