2015-12-16 2 views
0
val vJsonLoc = new HashMap[String, String]();  
def getPrevJson(s:String) = vJsonLoc.get(s) 
val previousFile = getPrevJson(s"/${site.toLowerCase}/$languagePath/$channel/v$v/$segment") 

это возвращаетScala HashMap получить строковое значение возвращает некоторые()

Some(/Users/abc/git/abc-c2c/) 

на том, чтобы конечная строка previousFile + "/" + index + ".json"

результат Some(/Users/abc/git/abc-c2c/)/0.json, когда желаемый результат /Users/abc/git/abc-c2c/0.json

Guess это это некоторая концепция Опциона, которая не поняла. Новое для scala.

ответ

0

Scala Map по телефону getOption. Используйте vJsonLoc(s) вместо vJsonLoc.get(s)

+1

Обратите внимание, что 'vJsonLoc (s)' небезопасно, т. Е. Частично - он выдает «NoSuchElementException», если поисковый ключ не существует на карте. 'scala> Карта (1 -> 100) (5) java.util.NoSuchElementException: ключ не найден: 5' –

+0

Согласен. Описание @bedwyr и решение более общие – Rumoku

1

Как вы отметили, вы получаете обратно в 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 ").