开发者

How do I handle Hashtable nulls in Scala?

开发者 https://www.devze.com 2023-03-21 07:35 出处:网络
I\'m porting some java code across and have the following val overnightChanges: java.util.Hashtable[String, Double] = ...

I'm porting some java code across and have the following

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

When I try

if (null != over开发者_如何学编程nightChanges.get(...))

I get the following warning

warning: comparing values of types Null and Double using `!=' will always yield true


Primitive and reference types are much less different in scala than they are in java, and so the convention is that name starts with an uppercase for all of them. Double is scala.Double which is the primitive java double, not the reference java.lang.Double.

When you need "a double or no value" in scala, you would use Option[Double] most of the time. Option has strong library support, and the type system will not let you ignore that there might be no value. However, when you need to interact closely with java, as in your example, your table does contain java.lang.Double and you should say it so.

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

If java.lang.Double starts to appear everywhere in your code, you can alias to JDouble, either by importing

import java.lang.{Double => JDouble}

or by defining

type JDouble = java.lang.Double 

There are implicit conversions between scala.Double and java.lang.Double, so interaction should be reasonably smooth. However, java.lang.Double should probably be confined to the scala/java interaction layer, it would be confusing to have it go deep into scala code.


In Scala Double are primitives and thus cannot be null. That's annoying when using directly java maps, because when a key is not defined, you get the default primitive value, (here 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

If the value is a object like String or List, your code should work as expected.

So, to solve the problem, you can:

  1. Use contains in an outer if condition.
  2. Use one of the Scala maps (many conversions are defined in scala.collection.JavaConversions)


Use Scala "options", also known as "maybe" in Haskell:

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

0

精彩评论

暂无评论...
验证码 换一张
取 消