如何处理Scala中的Hashtable空值?

时间:2011-07-20 05:28:44

标签: scala scala-java-interop

我正在移植一些Java代码并具有以下内容

val overnightChanges: java.util.Hashtable[String, Double] = ...

当我尝试

if (null != overnightChanges.get(...))

我收到以下警告

警告:使用`!='比较Null和Double类型的值将始终产生true

3 个答案:

答案 0 :(得分:14)

scala中的原始类型和引用类型与java中的不同,因此惯例是名称以所有类型的大写字母开头。 Doublescala.Double,它是原始的java double,而不是引用java.lang.Double

如果在scala中需要“double或no value”,则大多数情况下都会使用Option[Double]。 Option具有强大的库支持,类型系统不会让您忽略可能没有值。但是,当你需要与java密切交互时,就像在你的例子中一样,你的表确实包含java.lang.Double,你应该这样说。

val a = new java.util.HashMap[String, java.lang.Double]

如果java.lang.Double开始出现在您的代码中的任何位置,您可以通过导入

为别名添加别名
import java.lang.{Double => JDouble}

或通过定义

type JDouble = java.lang.Double 

scala.Doublejava.lang.Double之间存在隐式转换,因此互动应该相当顺畅。但是,java.lang.Double可能应该仅限于scala / java交互层,让它深入到scala代码中会让人感到困惑。

答案 1 :(得分:5)

在Scala中,Double是原语,因此不能为null。当直接使用java地图时,这很烦人,因为当没有定义一个键时,你会得到默认的原始值,(这里是0.0):

scala>  val a = new java.util.Hashtable[String,Double]()
a: java.util.Hashtable[String,Double] = {}

scala> a.get("Foo")
res9: Double = 0.0

如果值是String或List之类的对象,则代码应按预期工作。

因此,要解决问题,您可以:

  1. 在外部if条件中使用contains
  2. 使用其中一个Scala地图(许多转化在scala.collection.JavaConversions中定义)

答案 2 :(得分:0)

在Haskell中使用Scala“options”,也称为“maybe”:

http://blog.danielwellman.com/2008/03/using-scalas-op.html