Как мне обрабатывать нули Hashtable в Scala?

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

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

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

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

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

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


person deltanovember    schedule 20.07.2011    source источник


Ответы (3)


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

Когда вам нужно «двойное или нулевое значение» в scala, вы будете использовать Option[Double] большую часть времени. Option имеет сильную библиотечную поддержку, и система типов не позволит вам игнорировать то, что значение может отсутствовать. Однако, когда вам нужно тесно взаимодействовать с 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.

person Didier Dupont    schedule 20.07.2011
comment
Стоит отметить, что Option(javaHashtable.get(...)) превратит java.lang.Double или null в Option[java.lang.Double]. В общем, рекомендуется заключать методы Java, допускающие значение NULL, в Option, чтобы предотвратить попадание null в код Scala. - person Aaron Novstrup; 20.07.2011
comment
Кроме того, когда вы говорите двойное или нулевое значение, я думаю, вы имеете в виду двойное или нулевое значение (но не двойное или нулевое значение). ;-) - person Aaron Novstrup; 20.07.2011
comment
(Для тех, для кого английский язык не является родным, пожалуйста, извините за каламбур) - person Aaron Novstrup; 20.07.2011
comment
Раньше во Франции была радиоигра с похожим названием. Не знаю, как это было написано с заглавной буквы. - person Didier Dupont; 21.07.2011
comment
В американском английском, по крайней мере, двойной или ничто - это идиома для возможности либо удвоить свой выигрыш, либо потерять их все (в игре) - к сожалению, методы, допускающие значение NULL, предлагают только последнее. Под Double or Nothing я имел в виду типы Scala. - person Aaron Novstrup; 21.07.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)
person paradigmatic    schedule 20.07.2011

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

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

person ninjagecko    schedule 20.07.2011
comment
В этом блоге не рассматривается проблема OP с java.util.Hashtable. Вместо этого он использует коллекцию Scala - person The Archetypal Paul; 20.07.2011