27

Я хотел был бы иметь возможность выполнить следующее, но это не удается в вызове useMap. Как я могу выполнить это преобразование?Как преобразовать карту Scala в Java Map с помощью scala.Float to java.Float k/v conversion

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) 
        ^

Кажется, что работает с картой [String, String], но не с картой [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-to-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] 

Тип v является Map[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

Использование Scala предопределены float2Float и использовать JavaConverters для выполнения преобразования в явном виде.

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