Ответ 1
Изменить: рекомендуется использовать метод 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
вызовет неявное преобразование из java Map
в scala Map
, а затем вызывает toSet
в коллекции java с неявным преобразованием его в коллекцию scala, а затем a 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))