将具有Java对象的映射转换为Scala对应物(整数 - > Int,Long - > Long等)

时间:2015-12-31 11:24:12

标签: scala

我正在尝试将java.util.Map转换为Map [String,Any]。我将java地图作为我的java界面的一部分。

我遇到了将Integer转换为Int和java.lang.Long转换为scala.Long的问题。

代码如下:

vendorcost

最后两行的结果是:

import java.math.{BigDecimal => JavaBigDecimal}
import scala.collection.JavaConverters.mapAsScalaMapConverter
import scala.collection.mutable

val input = new java.util.HashMap[String, Object]()
input.put("test", Integer.valueOf(1))
input.put("test2", new JavaBigDecimal("12"))

val scalaMap = input.asScala
//noinspection ScalaStyle
val filter: mutable.Map[String, Object] = scalaMap.filter(_._2 != null)
val toMap: Map[String, Any] = filter.toMap
val initialContext = toMap.mapValues {
  case b: JavaBigDecimal => BigDecimal(b)
  case i: Integer => Integer2int(i)
  case l: java.lang.Long => l.toLong
  case a: Any if a == null => None
  case a: Any if a != null => a
}

initialContext.get("test").get.getClass
initialContext.get("test2").get.getClass

BigDecimal做了我期望它做的事,但是Int(以及Long),不做。它似乎神奇地转换回整数。此外,当我只是添加一个不同的静态数字时:

res3: Class[?0] = class java.lang.Integer
res4: Class[?0] = class scala.math.BigDecimal

它将把它变成一个整数

我需要这个类信息,因为我的java API更深入,我会检查期望的类型是否与gotten类型匹配,而Int(期望的)与Integer不匹配。

1 个答案:

答案 0 :(得分:3)

部分功能

{
  case b: JavaBigDecimal => BigDecimal(b)
  case i: Integer => Integer2int(i)
  case l: java.lang.Long => l.toLong
  case a: Any if a == null => None
  case a: Any if a != null => a
}

返回Any。但是这种类型实际上并不存在于JVM上;相反,Scala编译器使用Object。所以原始类型是自动装箱的:Intjava.lang.IntegerLongjava.lang.Long等等。

  

我需要这个类信息,因为我的java API更深入,我会检查期望的类型是否与gotten类型匹配,而Int(期望的)与Integer不匹配。

使用盒装类型进行比较,或将所需类与Map[String, (Any, Class[_])]中的值一起存储。