Convert Java Map to Scala Map

匿名 (未验证) 提交于 2019-12-03 02:05:01

问题:

I have a java map: java.util.Map> 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 to a MultiMap[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.

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


回答2:

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.



回答3:

Immutable Map myJavaMap.asScala.toMap

Mutable Map myJavaMap.asScala



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!