Converting Map[String, Double] to java.util.Map[String, java.lang.Double]

前端 未结 3 1890
野趣味
野趣味 2021-01-14 15:15

I thought we can rely on implicit conversion which converts scala.Double to java.lang.Double. So I tried the following:

import scal         


        
相关标签:
3条回答
  • 2021-01-14 15:41

    It seems that for String, you don't need to do any conversion, but is not the case for Double. You can use the method double2Double which is defined in Predef to convert to java.double.

    import scala.collection.JavaConverters._
    
    m.map { case (k, v) => k -> double2Double(v) }.asJava
    

    or another way is to do asInstanceOf to convert it to Java map directly.

    0 讨论(0)
  • 2021-01-14 15:47

    You need the boxed version of double:

    import scala.collection.JavaConverters._
    
    m.mapValues(Double.box).asJava
    

    The implicits are able to convert a value of Double to java.lang.Double, but not a Map[String,Double] to java.util.Map[String,java.lang.Double].

    String requires no conversion because String is a java.lang.String while Double is a double (primitive).

    0 讨论(0)
  • 2021-01-14 15:50

    The issue here is that scala.Double is a primitive (equivalent to Java double) while java.lang.Double is a class. They are not at all the same thing. The JavaConverters converts between Java Map and Scala Map, not their contents. This works:

    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
      }
    }
    
    0 讨论(0)
提交回复
热议问题