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