簡體   English   中英

將Map [String,Double]轉換為java.util.Map [String,java.lang.Double]

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

我認為我們可以依賴隱式轉換將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)
}

為什么不起作用? 執行此類轉換的慣用方法是什么?

你需要盒裝版的double

import scala.collection.JavaConverters._

m.mapValues(Double.box).asJava

implicits能夠將Double的值轉換為java.lang.Double ,但不能將Map[String,Double]java.util.Map[String,java.lang.Double]

String不需要轉換,因為String java.lang.StringDoubledouble (原始)。

似乎對於String ,您不需要進行任何轉換,但Double不是這種情況。 您可以使用double2Double中定義的Predef方法轉換為java.double。

import scala.collection.JavaConverters._

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

或者另一種方法是將asInstanceOf直接轉換為Java映射。

這里的問題是scala.Double是一個原語(相當於Java double ),而java.lang.Double是一個類。 他們完全不是一回事。 JavaConverters在Java Map和Scala Map之間JavaConverters轉換,而不是它們的內容。 這有效:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM