java scala type-conversion scala-collections scala-java-interop

Convertir Java Map a Scala Map



type-conversion scala-collections (4)

Tengo un mapa de Java: java.util.Map<SomeObject, java.util.Collection<OtherObject>> y me gustaría convertirlo al mapa scala: Map[SomeObject, Set[OtherObject]]

He usado mapAsScalaMap pero el resultado no es el que quiero, el resultado es: Map[SomeObject, java.util.Collection[OtherObject]] . ¿Cómo puedo arreglarlo para convertir también la colección a un conjunto?

NOTA: en realidad, mi problema original era convertir ArrayListMultimap<SomeObject, OtherObject> en un MultiMap[SomeObject, OtherObject] pero como esto no era posible, he dividido el problema. Si tiene una solución para el problema original, también lo aceptaré como la respuesta.


Mapa inmutable myJavaMap.asScala.toMap

Mapa Mutable myJavaMap.asScala


Puede convertir el Mapa de Java en Scala Map usando la función siguiente:

val scalaMap = javaMap.asScala;

Para usar esto, debe importar la biblioteca de importación scala.collection.JavaConverters._.

Espero que esto ayude.


Si tienes que hacer esto desde 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());

Basado en: https://.com/a/45373345/5209935


Editar : la forma recomendada ahora es usar JavaConverters y el método .asScala :

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

Esto tiene la ventaja de no usar conversiones mágicas implícitas, sino llamadas explícitas a .asScala , mientras se mantiene limpio y consanguíneo.

La respuesta original con JavaConversions :

Puede usar scala.collection.JavaConversions para convertir implícitamente Java y Scala:

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

Llamar a mapValues desencadenará una conversión implícita del Map java a un Map scala, y luego llamar a toSet en la colección java implícitamente convertirlo a una colección scala y luego a un Set .

Por defecto, devuelve un Map mutable, puede obtener uno inmutable con un .toMap adicional.

Ejemplo corto-ish:

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