来自Java API我得到了
java.util.LinkedHashMap[String,java.util.ArrayList[String]]
然后我需要将其作为参数传递给scala程序
val rmap = Foo.baz(parameter)
此参数属于scala类型:
Map[String,List[String]]
那么我怎样才能轻松转换
java.util.LinkedHashMap[String,java.util.ArrayList[String]]
到
Map[String,List[String]]
我尝试使用import scala.collection.JavaConversions._,但在我的情况下,这不起作用(或者至少这是我的猜测),因为scala代码在模板函数中,我只能放置导入scala.collection.JavaConversions ._里面的功能。 模板功能如下:
def someFunc(param: java.util.LinkedHashMap[String,java.util.ArrayList[String]]) = {
import scala.collection.JavaConversions._
val rmap = Foo.baz(param) // param is of scala type Map[String,List[String]]
.......
现在scala不会自动将java类型转换为scala类型。
这是我得到的编译器错误: 引发的错误是:类型不匹配; found:java.util.LinkedHashMap [String,java.util.ArrayList [String]] required:Map [String,List [String]]
答案 0 :(得分:5)
只需导入scala.collection.JavaConversions
即可设置:)
它执行从Scala集合到Java集合的转换,反之亦然。
如果操作不顺畅,请尝试:
val m: Map[String,List[String]] = javaMap
您可能还需要转换地图中的每个列表:
m.map {
l => val sl: List[String] = l
sl
}
答案 1 :(得分:5)
你有两个问题:scala中的Map和List与java版本不同。
scala.collection.JavaConversions.mapAsScalaMap创建一个可变映射,因此使用可变映射,以下工作:
import scala.collection.JavaConversions._
import scala.collection.mutable.Map
val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]]
var g: Map[String, java.util.ArrayList[String]] = f
ArrayList有点困难。以下作品:
import scala.collection.JavaConversions._
import scala.collection.mutable.Buffer
val a = new java.util.ArrayList[String]
var b: Buffer[String] = a
但如果我们尝试
import scala.collection.JavaConversions._
import scala.collection.mutable.Map
import scala.collection.mutable.Buffer
val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]]
var g: Map[String, Buffer[String]] = f
这不起作用。您最好的选择是为此自己定义一个显式的隐式转换。
答案 2 :(得分:1)
scala.collection.JavaConversions.mapAsScalaMap
或JavaConversions对象中的类似内容
答案 3 :(得分:0)
您可以尝试使用
val rmap = Foo.baz(parameter.asScala.toMap.mapValues(v => v.asScala.toList))
在您的代码中导入以下内容 -
import scala.collection.JavaConversions._
import scala.collection.JavaConverters._