Как вы отметили, вы получаете обратно в Option
типа, а не прямую ссылку на String
, содержащейся в вашей структуре данных. Это очень стандартная практика Scala, позволяющая лучше обрабатывать случаи, когда ожидаемое значение может отсутствовать в вашей структуре данных.
Например, в Java этот тип метода обычно возвращает значение, если оно существует, и null
, если это не так. Это означает, однако, что последующий код может работать от значения null
и, следовательно, вам потребуется дополнительная защита от исключений.
В Scala вы получаете ссылку на объект, который может или не может иметь ожидаемое значение. Это тип Option
и может быть либо Some
(в этом случае ссылка доступна), либо None
(в этом случае у вас есть несколько вариантов его обработки).
Рассмотрим код:
val vJsonLoc = new HashMap[String, String]();
def getPrevJson(s:String) = vJsonLoc.get(s)
val previousFile = getPrevJson(s"/${site.toLowerCase}/$languagePath/$channel/v$v/$segment")
Если HashMap
возвращенного String
, ваш previousFile
ссылка может указывать либо значение null
или значение String
. Вам необходимо защитить от потенциального исключения (регулярная практика на Java).
Но в Scala, get
возвращается в Option
тип, который может быть обработан в ряде способов:
val previousFile = getPrevJson("your_string").getOrElse("")
//or
val previousFile = getPrevJson("your_string") match {
case Some(ref) => ref
case None => ""
}
Результирующая ссылка previousFile
будет указывать на значение Строка: либо ожидаемое значение ("получить ") или пустую строку (" OrElse ").
Обратите внимание, что 'vJsonLoc (s)' небезопасно, т. Е. Частично - он выдает «NoSuchElementException», если поисковый ключ не существует на карте. 'scala> Карта (1 -> 100) (5) java.util.NoSuchElementException: ключ не найден: 5' –
Согласен. Описание @bedwyr и решение более общие – Rumoku