49

私は Java マップを持っています:java.util.Map<SomeObject, java.util.Collection<OtherObject>> そしてそれをスカラマップに変換したいと思います:Map[SomeObject, Set[OtherObject]]

私はmapAsScalaMapを使用しましたが、結果は私が望むものではありません。結果は次のとおりMap[SomeObject, java.util.Collection[OtherObject]]です。コレクションをセットに変換するように修正するにはどうすればよいですか?

注: 実際、私の最初の問題は、Google を に変換することでしArrayListMultimap<SomeObject, OtherObject>MultiMap[SomeObject, OtherObject]が、これは不可能だったので、問題を分割しました。元の問題の解決策がある場合は、それも回答として受け入れます。

4

4 に答える 4

68

編集:推奨される方法は、使用することJavaConvertersであり、.asScala方法は次のとおりです。

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

これには、魔法のような暗黙的な変換を使用するのではなく、 への明示的な呼び出しを使用するという利点がありますが.asScala、クリーンで簡潔なままです。


元の回答JavaConversions:

scala.collection.JavaConversionsJava と Scala の間で暗黙的に変換するために使用できます。

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

を呼び出すと、Javaから scala へmapValuesの暗黙的な変換がトリガーされ、Java コレクションを呼び出すと暗黙的にそれが scala コレクションに変換され、次に.MapMaptoSetSet

デフォルトでは、 mutableMapを返します。追加の.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))
于 2013-06-04T14:10:32.747 に答える
1

以下の関数を使用して、Java Map を Scala Map に変換できます。

val scalaMap = javaMap.asScala;

これを使用するには、 import scala.collection.JavaConverters._ ライブラリをインポートする必要があります。

お役に立てれば。

于 2014-06-27T19:32:28.893 に答える