30

Mam mapę Java: java.util.Map<SomeObject, java.util.Collection<OtherObject>> i chciałbym, aby przekształcić go na mapie scala: Map[SomeObject, Set[OtherObject]]Konwersja Java Mapa Scala Mapa

użyłem mapAsScalaMap ale wynik nie jest całkiem to, czego chcę, wynikiem jest: Map[SomeObject, java.util.Collection[OtherObject]]. Jak mogę to naprawić, aby przekonwertować kolekcję na zestaw?

UWAGA: faktycznie moim pierwotnym problemem było przekonwertowanie go na ArrayListMultimap<SomeObject, OtherObject> na MultiMap[SomeObject, OtherObject], ale ponieważ nie było to możliwe, podzieliłem problem. Jeśli masz rozwiązanie pierwotnego problemu, przyjmuję to również jako odpowiedź.

+0

spojrzenie na tym stanowisku: http://stackoverflow.com/questions/3127238/convert-java-util-mapstring-object-to-scala- collection-immutable-mapstring –

+0

i ta strona: http://www.scala-lang.org/docu/files/collections-api/collections_46.html –

+0

@LutherBlisset: Ma taki sam efekt jak mapAsScalaMap: Map [SomeObject, java .util.Collection [OtherObject]] – Ha11owed

Odpowiedz

41

Edit: zalecanym sposobem jest użycie JavaConverters i metoda .asScala:

import scala.collection.JavaConverters._ 
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet) 

Ma to tę zaletę, że nie używając magicznych niejawne konwersje, ale wyraźnych połączeń do .asScala, podczas pobytu czyste i consise.


Oryginalny odpowiedź z JavaConversions:

Można użyć scala.collection.JavaConversions niejawnie konwertować między Java i Scala:

import scala.collection.JavaConversions._ 
val myScalaMap = myJavaMap.mapValues(_.toSet) 

Wywołanie mapValues wywoła niejawna konwersja z Java Map do a scala Map, a następnie wywołanie toSet w kolekcji java z niejawnie zamień go na kolekcję scala, a następnie na Set.

Domyślnie zwraca zmienną wartość Map, można uzyskać niezmienny z dodatkowym .toMap.

Short-owski przykład:

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)) 
+0

Dziękuję, brakowało mi części "mapValues ​​(_. ToSet)" – Ha11owed

+2

@ Ha11owed Ludzie polecają konwertery: http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and- javaconversions-in-scala i komentarze do http://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html –

0

można przekonwertować Mapa Java do Scala Mapa użyciu funkcji poniżej:

val scalaMap = javaMap.asScala; 

Za pomocą tego trzeba importować scala.collection importu. Biblioteka JavaConverters._.

Mam nadzieję, że to pomoże.

0

Niezmienne Mapa myJavaMap.asScala.toMap

Zmienna Mapa myJavaMap.asScala