web-dev-qa-db-ja.com

Java Map to Scala Map

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]しかし、これは不可能だったため、問題を分割しました。元の問題の解決策があれば、それも答えとして受け入れます。

41
Ha11owed

編集:推奨される方法は、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))
62
gourlaysama

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());

ベース: https://stackoverflow.com/a/45373345/5209935

1
Matthew

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

val scalaMap = javaMap.asScala;

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

お役に立てれば。

0
AJ.P

不変のマップmyJavaMap.asScala.toMap

可変マップmyJavaMap.asScala

0
Manali Bhosale