2011-07-04 82 views
4

從Java API我得到如何將java Map轉換爲scala LinkedHashMap類型的地圖[String,ArrayList [String]]?

java.util.LinkedHashMap[String,java.util.ArrayList[String]] 

,然後我需要作爲參數傳遞給Scala程序

val rmap = Foo.baz(parameter) 

這個參數是斯卡拉類型:

Map[String,List[String]] 

那麼如何我可以輕鬆轉換

java.util.LinkedHashMap[String,java.util.ArrayList[String]] 

Map[String,List[String]] 

我試圖用進口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的類型。

這是我得到的編譯器錯誤: 引發的錯誤是:type mismatch;發現:java.util.LinkedHashMap中[字符串,java.util.ArrayList中的[字符串]要求:地圖[字符串,列表[字符串]

回答

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 

這不起作用。你最好的選擇是自己定義一個明確的隱式轉換。

+1

「顯式隱式轉換」。 <3斯卡拉。 :) – tsuna

5

只需導入scala.collection.JavaConversions,你應該設置:) 它從斯卡拉執行轉換集合到Java集合中,反之亦然。

如果它不工作的順利開展,嘗試:

val m: Map[String,List[String]] = javaMap 

您可能還需要在地圖內列出的每一個轉換:

m.map { 
    l => val sl: List[String] = l 
    sl 
} 
+4

這是不正確;你需要'導入collection.JavaConversions._'。 –

+1

這是真的。導入scala.collection.JavaConversions._比隱式轉換所有集合。 – jilen

1
scala.collection.JavaConversions.mapAsScalaMap 

或類似的東西JavaConversions對象

+0

謝謝你的回答。我更新了我的問題。 – rjc

0

您可以嘗試在代碼中使用下面

val rmap = Foo.baz(parameter.asScala.toMap.mapValues(v => v.asScala.toList)) 

導入 -

import scala.collection.JavaConversions._ 
import scala.collection.JavaConverters._ 
相關問題