30

Java Harita dönüştürme: java.util.Map<SomeObject, java.util.Collection<OtherObject>> ve ben scala haritaya dönüştürmek istiyorum: Ben mapAsScalaMap kullandık Map[SomeObject, Set[OtherObject]]bir java haritası var Scala Harita

ancak sonuç ne istiyorum oldukça değildir, Sonuç: Map[SomeObject, java.util.Collection[OtherObject]]. Koleksiyonu koleksiyona da dönüştürmek için onu nasıl düzeltebilirim?

Not: aslında benim asıl sorun google'ın ArrayListMultimap<SomeObject, OtherObject> bir MultiMap[SomeObject, OtherObject] dönüştürmek oldu ama bu mümkün olmadığından sorunu ayırdım. Orijinal sorun için bir çözümünüz varsa, bunu yanıt olarak kabul ediyorum.

+0

bu yazı bakmak: http://stackoverflow.com/questions/3127238/convert-java-util-mapstring-object-to-scala- collection-immutable-mapstring –

+0

ve bu sayfa: http://www.scala-lang.org/docu/files/collections-api/collections_46.html –

+0

@LutherBlisset: mapAsScalaMap ile aynı sonucu vardır: Map [SomeObject, java .util.Collection [OtherObject]] – Ha11owed

cevap

41

Düzenleme: önerilen yöntem JavaConverters kullanmak artık ve .asScala yöntemi:

temiz ve consise kalırken Bu, büyülü örtük dönüşümleri ancak .asScala üzere açık çağrılar kullanmayan avantajına sahiptir
import scala.collection.JavaConverters._ 
val myScalaMap = myJavaMap.asScala.mapValues(_.asScala.toSet) 

.


JavaConversions orijinal cevap: java Map için bir örtük dönüştürme tetikleyecektir mapValues çağrılması

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

:

Sen örtülü Java ve Scala arasında dönüştürmek için scala.collection.JavaConversions kullanabilirsiniz bir scala Map, ve dolaylı olarak java koleksiyonunda toSet'u arayarak bir scala koleksiyonuna ve daha sonra Set'a dönüştürün.

Varsayılan olarak, dönüştürülebilir bir Map döndürür, ek bir .toMap ile değiştirilemez bir tane alabilirsiniz.

Kısa imsi örnek:

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

Teşekkür ederim, "mapValues ​​(_. ToSet)" parçasını kaçırdım "part – Ha11owed

+2

@ Ha11owed İnsanlar dönüştürücüleri önerir: http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and- javaconversions-in-scala ve http://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html adresine yorumlar –

0

aşağıdaki fonksiyonu kullanarak Scala Haritası haline Java Harita dönüştürebilirsiniz:

val scalaMap = javaMap.asScala; 

Eğer ithalat scala.collection ithalat gerekir bu kullanmak için. JavaConverters._ kütüphanesi.

Bu yardımcı olur umarım.

0

Immutable Harita myJavaMap.asScala.toMap

Değişken Harita myJavaMap.asScala