web-dev-qa-db-de.com

Konvertieren Sie Java Map in Scala Map

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.

38
Ha11owed

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))
59
gourlaysama

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

1
Matthew

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.

0
AJ.P

Unveränderbare Map myJavaMap.asScala.toMap

Mutable Map myJavaMap.asScala

0
Manali Bhosale