簡體   English   中英

將Java Map轉換為Scala Map

[英]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());

基於: https//stackoverflow.com/a/45373345/5209935

您可以使用以下函數將Java Map轉換為Scala Map:

val scalaMap = javaMap.asScala;

要使用它,您需要導入導入scala.collection.JavaConverters._庫。

希望這可以幫助。

不可變地圖myJavaMap.asScala.toMap

可變地圖myJavaMap.asScala

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM