Как мне обработать Hashtable нули в Scala? - PullRequest
4 голосов
/ 20 июля 2011

Я портирую некоторый Java-код и получаю следующее

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

Когда я пытаюсь

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

Я получаю следующее предупреждение

предупреждение: сравнение значений типов Null и Double с использованием `! = 'Всегда даст true

Ответы [ 3 ]

14 голосов
/ 20 июля 2011

Примитивные и ссылочные типы в scala значительно меньше, чем в java, и поэтому соглашение заключается в том, что имя начинается с заглавных букв для всех из них.Double - это scala.Double, который является примитивом java double, а не ссылкой java.lang.Double.

Когда вам нужно «двойное или нулевое значение» в scala, вы будете использовать Option[Double] большую часть времени.Опция имеет сильную поддержку библиотеки, и система типов не позволит вам игнорировать, что может не быть значения.Однако, когда вам нужно тесно взаимодействовать с java, как в вашем примере, ваша таблица содержит java.lang.Double, и вы должны сказать это так.

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

Если java.lang.Double начинает появляться везде в вашем коде, вы можете создать псевдоним JDouble, импортировав

import java.lang.{Double => JDouble}

или определив

type JDouble = java.lang.Double 

Есть неявные преобразования между scala.Double и java.lang.Double, поэтому взаимодействие должно быть достаточно плавным.Тем не менее, java.lang.Double, вероятно, следует ограничить уровнем взаимодействия scala / java, было бы странно, если бы он углубился в код scala.

5 голосов
/ 20 июля 2011

В Scala Double являются примитивами и поэтому не могут быть нулевыми.Это раздражает при использовании непосредственно 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. Использовать contains во внешнем условии if.
  2. Использовать одно изКарты Scala (многие преобразования определены в scala.collection.JavaConversions)
0 голосов
/ 20 июля 2011

Используйте Scala «options», также известный как «возможно» в Haskell:

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

...