Java map:Java.util.Map<SomeObject, Java.util.Collection<OtherObject>>
と私はそれをscala map:Map[SomeObject, Set[OtherObject]]
mapAsScalaMapを使用しましたが、結果は期待したものとは異なり、結果はMap[SomeObject, Java.util.Collection[OtherObject]]
。コレクションをセットに変換するように修正するにはどうすればよいですか?
注:実際に私の最初の問題は、GoogleのArrayListMultimap<SomeObject, OtherObject>
からMultiMap[SomeObject, OtherObject]
しかし、これは不可能だったため、問題を分割しました。元の問題の解決策があれば、それも答えとして受け入れます。
編集:推奨される方法は、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コレクションに変換してから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))
Javaからこれを行う必要がある場合:
List<Tuple2<A, B>> tuples = javaMap.entrySet().stream()
.map(e -> Tuple2.apply(e.getKey(), e.getValue()))
.collect(Collectors.toList());
scala.collection.Map scalaMap = scala.collection.Map$.MODULE$.apply(JavaConversions.asScalaBuffer(tuples).toSeq());
以下の関数を使用して、Java MapをScala Mapに変換できます。
val scalaMap = javaMap.asScala;
これを使用するには、インポートscala.collection.JavaConverters._ライブラリをインポートする必要があります。
お役に立てれば。
不変のマップmyJavaMap.asScala.toMap
可変マップmyJavaMap.asScala