Ich habe eine Java-Karte: Java.util.Map<SomeObject, Java.util.Collection<OtherObject>>
Und möchte sie in die Scala-Karte konvertieren: Map[SomeObject, Set[OtherObject]]
Ich habe mapAsScalaMap verwendet, aber das Ergebnis ist nicht ganz das, was ich will, das Ergebnis ist: Map[SomeObject, Java.util.Collection[OtherObject]]
. Wie kann ich es beheben, um auch die Sammlung in ein Set zu konvertieren?
HINWEIS: Eigentlich bestand mein ursprüngliches Problem darin, den ArrayListMultimap<SomeObject, OtherObject>
von Google in einen MultiMap[SomeObject, OtherObject]
umzuwandeln. Wenn Sie eine Lösung für das ursprüngliche Problem haben, akzeptiere ich es auch als Antwort.
Edit : Die empfohlene Methode ist jetzt die Verwendung von JavaConverters
und der .asScala
-Methode:
import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)
Dies hat den Vorteil, dass keine magischen impliziten Konvertierungen verwendet werden, sondern explizite Aufrufe von .asScala
, während dies sauber bleibt.
Die ursprüngliche Antwort mit JavaConversions
:
Sie können scala.collection.JavaConversions
verwenden, um implizit zwischen Java und Scala zu konvertieren:
import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toSet)
Der Aufruf von mapValues
löst eine implizite Konvertierung von Java Map
in eine scala Map
aus. Anschließend wird toSet
in der Java-Sammlung aufgerufen, wobei diese implizit in eine scala-Sammlung und dann in eine Set
konvertiert wird.
Standardmäßig wird ein veränderlicher Map
zurückgegeben. Sie können einen unveränderlichen mit einem zusätzlichen .toMap
erhalten.
Kurzes Beispiel:
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))
Wenn Sie dies von Java aus tun müssen:
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());
Basierend auf: https://stackoverflow.com/a/45373345/5209935
Sie können die Java Map mit der folgenden Funktion in Scala Map konvertieren:
val scalaMap = javaMap.asScala;
Um dies zu verwenden, müssen Sie die Import-Bibliothek scala.collection.JavaConverters._ importieren.
Hoffe das hilft.
Unveränderbare Map myJavaMap.asScala.toMap
Mutable Map myJavaMap.asScala