从Java API我得到
java.util.LinkedHashMap[String,java.util.ArrayList[String]]
Run Code Online (Sandbox Code Playgroud)
然后我需要将其作为参数传递给scala程序
val rmap = Foo.baz(parameter)
Run Code Online (Sandbox Code Playgroud)
此参数是scala类型:
Map[String,List[String]]
Run Code Online (Sandbox Code Playgroud)
那我怎么能轻易转换
java.util.LinkedHashMap[String,java.util.ArrayList[String]]
Run Code Online (Sandbox Code Playgroud)
至
Map[String,List[String]]
Run Code Online (Sandbox Code Playgroud)
我尝试使用import scala.collection.JavaConversions._,但在我的情况下,这不起作用(或者至少这是我猜的)因为scala代码在模板函数中,我只能放入导入scala.collection.JavaConversions._ inside功能.模板功能如下:
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]]
.......
Run Code Online (Sandbox Code Playgroud)
现在scala不会自动将java类型转换为scala类型.
这是我得到的编译器错误:引发的错误是:类型不匹配; found:java.util.LinkedHashMap [String,java.util.ArrayList [String]] required:Map [String,List [String]]
只需导入即可scala.collection.JavaConversions设置:)它执行从Scala集合到Java集合的转换,反之亦然.
如果它不能顺利运行,请尝试:
val m: Map[String,List[String]] = javaMap
Run Code Online (Sandbox Code Playgroud)
您可能还需要转换地图中的每个列表:
m.map {
l => val sl: List[String] = l
sl
}
Run Code Online (Sandbox Code Playgroud)
你有两个问题: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
Run Code Online (Sandbox Code Playgroud)
ArrayList有点困难.以下作品:
import scala.collection.JavaConversions._
import scala.collection.mutable.Buffer
val a = new java.util.ArrayList[String]
var b: Buffer[String] = a
Run Code Online (Sandbox Code Playgroud)
但是,如果我们尝试
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
Run Code Online (Sandbox Code Playgroud)
这不起作用.您最好的选择是为此自己定义一个显式的隐式转换.