Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

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

Why doesn't it work? What would be the idiomatic way to perform such a conversion?

like image 489
St.Antario Avatar asked Aug 09 '26 22:08

St.Antario


2 Answers

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

like image 83
Alvaro Carrasco Avatar answered Aug 11 '26 14:08

Alvaro Carrasco


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.

like image 27
Max Avatar answered Aug 11 '26 15:08

Max



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!