如何将java Map转换为scala Map的类型为LinkedHashMap [String,ArrayList [String]]?

时间:2011-07-04 15:27:13

标签: scala

来自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]]

4 个答案:

答案 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._