27

我希望能夠執行以下操作,但在調用useMap時失敗。我如何執行此轉換?我怎樣才能將Scala地圖轉換成Java Map使用scala.Float轉換成java.Float k/v轉換

scala> import scala.collection.JavaConversions._ 
import scala.collection.JavaConversions._ 

scala> import scala.collection.JavaConverters._ 
import scala.collection.JavaConverters._ 

scala> def useMap(m: java.util.Map[java.lang.Integer, java.lang.Float]) = m 
useMap: (m: java.util.Map[Integer,Float])java.util.Map[Integer,Float] 

scala> val v: Map[Int, Float] = Map() 
v: Map[Int,Float] = Map() 

scala> useMap(v) 
<console>:10: error: type mismatch; 
found : scala.collection.immutable.Map[Int,scala.Float] 
required: java.util.Map[Integer,java.lang.Float] 
       useMap(v) 
        ^

它似乎與Map [String,String]一起使用,但不是Map [Int,Float]。

+2

看看[http://stackoverflow.com/questions/6991340/scala-convert-listint-to-a-java-util-listjava-lang-integer](http://stackoverflow.com/問題/ 6991340/scala-convert-listint -a-java-util-listjava-lang-integer) –

回答

33

解掛由@ pagoda_5b工作:Scala convert List[Int] to a java.util.List[java.lang.Integer]

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> val m = mapAsJavaMap(Map(1 -> 2.1f)).asInstanceOf[java.util.Map[java.lang.Integer, java.lang.Float]] 
m: java.util.Map[Integer,Float] = {1=2.1} 

scala> m.get(1).getClass 
res2: Class[_ <: Float] = class java.lang.Float 
3
scala> v.asJava 
<console>:16: error: type mismatch; 
found : java.util.Map[Int,scala.Float] 
required: java.util.Map[Integer,java.lang.Float] 

類型的vMap[scala.Int, scala.Float],不Map[java.lang.Integer, java.lang.Float]

你可以試試這個:

import java.lang.{Float => JFloat} 
useMap(v.map{ case (k, v) => (k: Integer) -> (v: JFloat)}) 
+0

我確實想過手動轉換數據,但幸運的是有更多的「自動」方法可用,請參閱pagoda_5b的註釋 – rvange

5

使用預定義階和float2Float使用JavaConverters明確地執行轉換。

import scala.collection.JavaConverters._ 
val scalaMap = Map(1 -> 1.0F) 
val javaMap = scalaMap.map{ case (k, v) => k -> float2Float(v) }.asJava