Ввод кода в интерпретаторе показывает, почему первый оператор компилируется:
type Date = String
scala> val time = crossingMap.getOrElse(crossingData, -1)
time: Any = -1
Обычно getOrElse
для Map[A, B]
(здесь B = CrossingDate
) принимает параметр любого типа B1 >: B
: это означает, что B1
должен быть супертипом B
. Здесь B1 = Any
, и -1, конечно, является допустимым значением типа Any
. В этом случае вы действительно хотите иметь объявление типа для time
.
Чтобы проверить, принадлежит ли ключ к карте, просто вызовите метод содержимого. Ниже приведен пример - поскольку Date не был доступен, я просто определил его как псевдоним String.
scala> crossingMap.contains(crossingData)
res13: Boolean = false
scala> crossingMap += "" -> ("", "")
res14: crossingMap.type = Map("" -> ("",""))
//Now "" is a map of the key
scala> crossingMap.contains("")
res15: Boolean = true
Если вы хотите проверить, является ли значение частью карты, проще всего написать этот код:
crossingMap.values.toSet.contains("")
Однако это создает Set
, содержащий все значения. РЕДАКТИРОВАТЬ: Вы можете найти лучшее решение для этой подзадачи в комментарии Киптон Баррос.