Подтвердить что ты не робот

Преобразование карты Java в Scala Карта

У меня есть java-карта: java.util.Map<SomeObject, java.util.Collection<OtherObject>> и я хотел бы преобразовать его в карту scala: Map[SomeObject, Set[OtherObject]]

Я использовал mapAsScalaMap, но результат не совсем то, что я хочу, результат: Map[SomeObject, java.util.Collection[OtherObject]]. Как его исправить, чтобы преобразовать коллекцию в набор?

ПРИМЕЧАНИЕ: на самом деле моя первоначальная проблема заключалась в том, чтобы преобразовать google ArrayListMultimap<SomeObject, OtherObject> в MultiMap[SomeObject, OtherObject], но так как это было невозможно, я разделил проблему. Если у вас есть решение исходной проблемы, я также соглашусь с ней в качестве ответа.

4b9b3361

Ответ 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))

Ответ 2

Вы можете преобразовать карту Java в карту Scala, используя следующую функцию:

val scalaMap = javaMap.asScala;

Для этого вам необходимо импортировать библиотеку импорта scala.collection.JavaConverters._.

Надеюсь, что это поможет.

Ответ 3

Неизменяемая карта myJavaMap.asScala.toMap

Mutable Map myJavaMap.asScala