将Map [String,Double]转换为java.util.Map [String,java.lang.Double]

时间:2016-11-18 17:24:43

标签: scala type-conversion

我认为我们可以依赖将scala.Double转换为java.lang.Double的隐式转换。所以我尝试了以下内容:

import scala.collection.JavaConverters._

object Main extends App {
  def main(args: Array[String]) = {
    val m = Map("10" -> 20.0)
    doSome(m.asJava) //error. Type mismatch found: java.util.Map[String,scala.Double]
                     //                  required: java.util.Map[String,java.lang.Double]
    doSome2(m.asJava)
  }
  def doSome(m: java.util.Map[java.lang.String, java.lang.Double]) = println(m)
  def doSome2(m: java.util.Map[java.lang.String, Double]) = println(m)
}

为什么它不起作用?进行这种转换的惯用方法是什么?

3 个答案:

答案 0 :(得分:6)

您需要装箱版double

import scala.collection.JavaConverters._

m.mapValues(Double.box).asJava

隐含可以将Double的值转换为java.lang.Double,但不能将Map[String,Double]转换为java.util.Map[String,java.lang.Double]

String不需要转换,因为String java.lang.StringDoubledouble(原始)。

答案 1 :(得分:3)

似乎对于String,您不需要进行任何转换,但Double不是这种情况。 您可以使用double2Double中定义的方法Predef转换为java.double。

import scala.collection.JavaConverters._

m.map { case (k, v) => k -> double2Double(v) }.asJava

或另一种方法是asInstanceOf直接将其转换为Java地图。

答案 2 :(得分:2)

这里的问题是scala.Double是一个原语(相当于Java double),而java.lang.Double是一个类。他们完全不是一回事。 JavaConverters在Java Map和Scala Map之间转换,而不是它们的内容。这有效:

import scala.collection.JavaConverters._

object Main {

  def main(args: Array[String]): Unit = {
    val m = Map("10" -> 20.0)
    doSome(mapConv(m))
    doSome2(m.asJava)
  }
  def doSome(m: java.util.Map[java.lang.String, java.lang.Double]) = println(m)
  def doSome2(m: java.util.Map[java.lang.String, Double]) = println(m)

  def mapConv(msd: Map[String, Double]): java.util.Map[java.lang.String, java.lang.Double] = {
    msd.map { case (k, v) => (k -> new java.lang.Double(v)) }.asJava
  }
}