[英]Convert Java Map to Scala Map
我有一個java地圖: java.util.Map<SomeObject, java.util.Collection<OtherObject>>
我想將它轉換為scala地圖: Map[SomeObject, Set[OtherObject]]
我使用了mapAsScalaMap但結果並不是我想要的,結果是: Map[SomeObject, java.util.Collection[OtherObject]]
。 如何修復它以將集合轉換為集合?
注意:實際上我的原始問題是將谷歌的ArrayListMultimap<SomeObject, OtherObject>
轉換為MultiMap[SomeObject, OtherObject]
但由於這是不可能的,我已經解決了問題。 如果您有原始問題的解決方案,我也會接受它作為答案。
編輯 :現在推薦的方法是使用JavaConverters
和.asScala
方法:
import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)
這樣做的好處是不使用神奇的隱式轉換,而是顯式調用.asScala
,同時保持干凈和明確。
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
的不可變的.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))
如果你必須從java做到這一點:
List<Tuple2<A, B>> tuples = javaMap.entrySet().stream()
.map(e -> Tuple2.apply(e.getKey(), e.getValue()))
.collect(Collectors.toList());
scala.collection.Map scalaMap = scala.collection.Map$.MODULE$.apply(JavaConversions.asScalaBuffer(tuples).toSeq());
您可以使用以下函數將Java Map轉換為Scala Map:
val scalaMap = javaMap.asScala;
要使用它,您需要導入導入scala.collection.JavaConverters._庫。
希望這可以幫助。
不可變地圖myJavaMap.asScala.toMap
可變地圖myJavaMap.asScala
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.