2011-07-04 10 views
4
のJava APIから

私が取得私は、このパラメータは、Scalaの型であるScalaのプログラムjava mapをscalaに変換するにはLinkedHashMap型のマップ[String、ArrayList [String]]?

val rmap = Foo.baz(parameter) 

にパラメータとして渡す必要があり

java.util.LinkedHashMap[String,java.util.ArrayList[String]] 

:それでは、どのよう

Map[String,List[String]] 

簡単に変換できますか

java.util.LinkedHashMap[String,java.util.ArrayList[String]] 

Map[String,List[String]] 

に私は輸入scala.collection.JavaConversions._を使用してみましたが、私の場合、これは動作しません(あるいは、少なくとも私は推測何thatsの)Scalaのコードはテンプレート関数であるため、私はできるだけで関数内にscala.collection.JavaConversions._をインポートします。 テンプレート関数は次のようである:

def someFunc(param: java.util.LinkedHashMap[String,java.util.ArrayList[String]]) = { 
import scala.collection.JavaConversions._ 
val rmap = Foo.baz(param) // param is of scala type Map[String,List[String]] 
....... 

今ScalaはScalaの型にJavaの型を変換し、自動ではありません。

これは私が得るコンパイラエラーです。 エラーが発生しました:タイプの不一致。見つかりました:java.util.LinkedHashMap [文字列、java.util.ArrayListの[文字列]]が必要:地図[文字列、リスト[文字列]]

答えて

5

スカラーのマップとリストは、Javaバージョンとは異なる2つの問題があります。

scala.collection.JavaConversions.mapAsScalaMapので可変マップは、次の作品を使用して、変更可能なマップを作成します。

import scala.collection.JavaConversions._ 
import scala.collection.mutable.Map 

val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]] 
var g: Map[String, java.util.ArrayList[String]] = f 

のArrayListは少し難しいです。以下の作品:

import scala.collection.JavaConversions._ 
import scala.collection.mutable.Buffer 

val a = new java.util.ArrayList[String] 
var b: Buffer[String] = a 

しかし、我々は

import scala.collection.JavaConversions._ 
import scala.collection.mutable.Map 
import scala.collection.mutable.Buffer 

val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]] 
var g: Map[String, Buffer[String]] = f 

をしようとした場合、これは動作しません。あなたにとって最良の選択肢は、明示的な暗黙的な変換を自分で定義することです。

+1

"明示的暗黙的変換"です。 <3スカラ。 :) – tsuna

5

ちょうどscala.collection.JavaConversionsをインポートし、あなたが設定する必要があります:) それはスカラからの変換を行い、 Javaコレクションへのコレクション、Javaコレクションへのコレクション、Javaコレクションへのコレクションなどがあります。

それがスムーズに動作しない場合は、試してみてください。

val m: Map[String,List[String]] = javaMap 

をあなたはまた、マップ内のリストのそれぞれを変換する必要があります

m.map { 
    l => val sl: List[String] = l 
    sl 
} 
+4

正しくありません。 'collection.JavaConversions._'をインポートする必要があります。 –

+1

が該当します。すべてのコレクションが暗黙的に変換されるよりも、scala.collection.JavaConversions._をインポートしてください。 – jilen

1
scala.collection.JavaConversions.mapAsScalaMap 

かで似たようなJavaConversionsオブジェクト

+0

お返事ありがとうございます。私は私の質問を更新しました。 – rjc

0

あなたはあなたのコードでは、以下の

val rmap = Foo.baz(parameter.asScala.toMap.mapValues(v => v.asScala.toList)) 

インポート使用して試すことができます -

import scala.collection.JavaConversions._ 
import scala.collection.JavaConverters._