14

Java API は ; を返しjava.util.Map<java.lang.String,java.lang.Boolean>ます。私はそれを入れたいと思いますMap[String,Boolean]

想像してみてください:

var scalaMap : Map[String,Boolean] = Map.empty
val javaMap = new JavaClass().map()   // Returns java.util.Map<java.lang.String,java.lang.Boolean>

Map.empty ++ javaMap++ メソッドは Java マップを認識しないため、実行できません。私は試した:

scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
    override def underlying = javaMap
}

と:

scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
    override def underlying = javaMap
  }

ジェネリックのため、これらは両方ともコンパイルに失敗します -java.lang.Stringスカラ文字列と同じではありません。

マップを手動でコピーする以外に、これを行う良い方法はありますか?

編集:ありがとう、すべての良い答え、私はそれらすべてから多くを学びました. しかし、私が実際に抱えている問題よりも簡単な問題をここに投稿して、間違いを犯しました。許可があれば、質問を一般化します - API が実際に返すのは

java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>

そして、これを Map[String, Map[SomeJavaEnum,String]] に移動する必要があります

それほど複雑ではないように思えるかもしれませんが、型消去のレベルが追加されます。これを Scala マップに移動するために私が見つけた唯一の方法は、それをディープ コピーすることでした (以下で提案した手法のいくつかを使用)。 . 誰でもヒントはありますか?正確な型の暗黙的な変換を定義することで問題を解決したので、少なくとも醜さはそれ自体の特性に隠されていますが、それでも多くを深くコピーするのは少し不器用です。

4

4 に答える 4

12

少なくとも Scala 2.9.2 では、コレクションを変換するより簡単な方法があります: "import collection.JavaConversions._" をインポートし、"toMap" を使用します。

例:

// show with Java Map:

scala> import java.util.{Map=>JMap}
scala> val jenv: JMap[String,String] = System.getenv()
jenv: java.util.Map[String,String] = {TERM=xterm, ANT_OPTS=-Xmx512m ...}

scala> jenv.keySet()
res1: java.util.Set[String] = [TERM, ANT_OPTS...]

// Now with Scala Map:

scala> import collection.JavaConversions._
scala> val env: Map[String,String] = System.getenv.toMap // <--- TADA <---
env: Map[String,String] = Map(ANT_OPTS -> -Xmx512m, TERM -> xterm ...)

// Just to prove it's got Scala functionality:

scala> env.filterKeys(_.indexOf("TERM")>=0)
res6: scala.collection.immutable.Map[String,String] = Map(TERM -> xterm, 
  TERM_PROGRAM -> iTerm.app, ITERM_PROFILE -> Default)

String から Boolean への java.util.map で問題なく動作します。

于 2012-08-31T02:14:39.767 に答える
6

ScalaStringはですjava.lang.String 、ScalaはではありBoolean ませんjava.lang.Boolean。したがって、次のように機能します。

import collection.jcl.Conversions._
import collection.mutable.{Map => MMap}
import java.util.Collections._
import java.util.{Map => JMap}

val jm: JMap[String, java.lang.Boolean] = singletonMap("HELLO", java.lang.Boolean.TRUE)

val sm: MMap[String, java.lang.Boolean] = jm //COMPILES FINE

しかし、あなたの問題は依然としてBoolean違いの問題です。Javaマップをscalaマップに「折りたたむ」必要があります。ScalaBooleanタイプを使用して再試行してください。

val sm: MMap[String, Boolean] = collection.mutable.Map.empty + ("WORLD" -> false)
val mm = (sm /: jm) { (s, t2) => s + (t2._1 -> t2._2.booleanValue) }

次にmm、元のScalaマップの内容とJavaマップにあったものを含むScalaマップです。

于 2009-06-22T17:52:36.310 に答える
2

useJavaMap.scala

import test._
import java.lang.Boolean
import java.util.{Map => JavaMap}
import collection.jcl.MapWrapper

object useJavaMap {
  def main(args: Array[String]) {
    var scalaMap : Map[String, Boolean] = Map.empty
    scalaMap = toMap(test.testing())
    println(scalaMap)
  }

  def toMap[K, E](m: JavaMap[K, E]): Map[K, E] = {
    Map.empty ++ new MapWrapper[K, E]() {
      def underlying = m
    }
  }
}

テスト/test.java

package test;

import java.util.*;

public class test {
    public static Map<String, Boolean> testing() {
        Map<String, Boolean> x = new HashMap<String, Boolean>();
        x.put("Test",Boolean.FALSE);
        return x;
    }
    private test() {}
}

コマンドライン

javac test\test.java
scalac useJavaMap.scala
scala useJavaMap
> Map(Test -> false)
于 2009-06-22T16:22:50.630 に答える
0

私は部分的な答えを持っていると思います...

Java マップを Java 型のスカラ マップに変換する場合。次に、それを scala 型の scala マップにマップできます。

val javaMap = new java.util.TreeMap[java.lang.String, java.lang.Boolean]
val temp = new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
    override def underlying = javaMap
}
val scalaMap = temp.map{
    case (k, v) => (k.asInstanceOf[String] -> v.asInstanceOf[Boolean])
}

この計画の欠点は、 の型がマップでscalaMapはなく Iterable[(java.lang.String, Boolean)] であることです。私はとても近くにいるように感じます。私よりも賢い誰かが最後のステートメントを修正して、これを機能させることができますか?!

于 2009-06-22T17:40:56.373 に答える