30

我有一個Java地圖:java.util.Map<SomeObject, java.util.Collection<OtherObject>> ,我想將其轉換爲斯卡拉地圖:Map[SomeObject, Set[OtherObject]]將Java地圖Scala的地圖

我用mapAsScalaMap但結果不是很我想要的東西,結果是:Map[SomeObject, java.util.Collection[OtherObject]]。我怎樣才能解決它也將集合轉換爲集合?

注意:其實我的原始問題是將谷歌的ArrayListMultimap<SomeObject, OtherObject>轉換爲MultiMap[SomeObject, OtherObject]但由於這是不可能的,我已經分裂了這個問題。如果您有原始問題的解決方案,我也會接受它作爲答案。

+0

看看這個帖子:http://stackoverflow.com/questions/3127238/convert-java-util-mapstring-object-to-scala- collection-immutable-mapstring –

+0

and this page:http://www.scala-lang.org/docu/files/collections-api/collections_46.html –

+0

@LutherBlisset:它與mapAsScalaMap具有相同的結果:Map [SomeObject,java .util.Collection [OtherObject]] – Ha11owed

回答

41

編輯:推薦的方法是使用現在JavaConverters.asScala方法:

import scala.collection.JavaConverters._ 
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet) 

這有沒有使用神奇隱式轉換而顯式調用.asScala的優勢,同時保持乾淨和consise。


原來的答案與JavaConversions

您可以使用scala.collection.JavaConversions隱式的Java和Scala之間的轉換:

import scala.collection.JavaConversions._ 
val myScalaMap = myJavaMap.mapValues(_.toSet) 

調用mapValues將觸發從Java Map到的隱式轉換一個scala Map,然後隱式地在java集合上調用toSet將其轉換爲Scala集合,然後轉換爲Set

默認情況下,它返回一個可變的Map,你可以得到一個不可變的.toMap

短上下的例子:

scala> val a: java.util.Map[String, java.util.Collection[String]] = new java.util.HashMap[String, java.util.Collection[String]] 
a: java.util.Map[String,java.util.Collection[String]] = {} 

scala> val b = new java.util.ArrayList[String] 
b: java.util.ArrayList[String] = [] 

scala> b.add("hi") 
res5: Boolean = true 

scala> a.put("a", b) 
res6: java.util.Collection[String] = [] 

scala> import scala.collection.JavaConversions._ 
import scala.collection.JavaConversions._ 

scala> val c = a.mapValues(_.toSet) 
c: scala.collection.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi)) 

scala> c.toMap 
res7: scala.collection.immutable.Map[String,scala.collection.immutable.Set[String]] = Map(a -> Set(hi)) 
+0

謝謝,我錯過了「mapValues(_。toSet)」部分 – Ha11owed

+2

@ Ha11owed人們推薦轉換器:http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and- javaconversions-in-scala和對http://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html的評論 –

0

您可以使用下面的函數轉換的Java地圖爲斯卡拉地圖:

val scalaMap = javaMap.asScala; 

對於使用此需要導入進口scala.collection。 JavaConverters._庫。

希望這會有所幫助。

0

不可變的映射 myJavaMap.asScala.toMap

易變地圖 myJavaMap.asScala