编辑:推荐的方法是现在使用JavaConverters
和.asScala
方法:
import scala.collection.JavaConverters._
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet)
这样做的好处是不使用神奇的隐式转换,而是显式调用.asScala
,同时保持简洁。
原来的答案是JavaConversions
:
您可以使用scala.collection.JavaConversions
在 Java 和 Scala 之间进行隐式转换:
import scala.collection.JavaConversions._
val myScalaMap = myJavaMap.mapValues(_.toSet)
调用mapValues
将触发从 javaMap
到 scala的隐式转换Map
,然后调用toSet
java 集合,将其隐式转换为 scala 集合,然后再转换为Set
.
默认情况下,它返回一个可变的Map
,你可以得到一个不可变的附加一个.toMap
。
简短的例子:
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))