Convert Java Map to Scala Map
Solution 1
Edit: the recommended way is now to use JavaConverters
and the .asScala
method:
import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)
This has the advantage of not using magical implicit conversions but explicit calls to .asScala
, while staying clean and consise.
The original answer with JavaConversions
:
You can use scala.collection.JavaConversions
to implicitly convert between Java and Scala:
import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toSet)
Calling mapValues
will trigger an implicit conversion from the java Map
to a scala Map
, and then calling toSet
on the java collection with implicitly convert it to a scala collection and then to a Set
.
By default, it returns a mutable Map
, you can get an immutable one with an additional .toMap
.
Short-ish example:
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))
Solution 2
Immutable Map
myJavaMap.asScala.toMap
Mutable Map
myJavaMap.asScala
Solution 3
If you have to do this from 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());
Based on: https://stackoverflow.com/a/45373345/5209935
Solution 4
You can convert the Java Map into Scala Map using the below function:
val scalaMap = javaMap.asScala;
For using this you need to import the import scala.collection.JavaConverters._ library.
Hope this helps.
Admin
Updated on July 09, 2022Comments
-
Admin almost 2 years
I have a java map:
java.util.Map<SomeObject, java.util.Collection<OtherObject>>
and I would like to convert it to the scala map:Map[SomeObject, Set[OtherObject]]
I have used mapAsScalaMap but the result is not quite what I want, the result is:
Map[SomeObject, java.util.Collection[OtherObject]]
. How can I fix it to also convert the collection to a set?NOTE: actually my original problem was to convert google's
ArrayListMultimap<SomeObject, OtherObject>
to aMultiMap[SomeObject, OtherObject]
but since this was not possible I've split the problem. If you have a solution for the original problem, I'll also accept it as the answer. -
Admin almost 11 yearsThank you, I was missing the "mapValues(_.toSet)" part
-
som-snytt almost 11 years@Ha11owed People recommend converters: stackoverflow.com/questions/8301947/… and comments to docs.scala-lang.org/overviews/collections/…