scala hashmap获取字符串值返回some()

时间:2015-12-16 15:14:33

标签: scala hashmap

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

返回

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

尝试追加字符串previousFile + "/" + index + ".json"

当所需结果为Some(/Users/abc/git/abc-c2c/)/0.json

时,结果为/Users/abc/git/abc-c2c/0.json

猜猜这是一些尚未理解的选择概念。 scala新手。

2 个答案:

答案 0 :(得分: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将指向String值:预期值(" get")或空字符串(" OrElse")。

答案 1 :(得分:0)

Map上的Scala get返回Option。使用vJsonLoc(s)代替vJsonLoc.get(s)