多个if-else语句从Scala中的映射中获取非空值

多个if-else语句从Scala中的映射中获取非空值,scala,scala-collections,Scala,Scala Collections,我有一个字符串到字符串的映射,它的值可以是空字符串。我想给变量分配一个非空值,以便在某个地方使用它。有没有更好的方法用Scala编写 import scala.collection.mutable var keyvalue = mutable.Map.empty[String, String] keyvalue += ("key1" -> "value1") var myvalue = "" if (keyvalue.get("key1").isDefined &&

我有一个字符串到字符串的映射,它的值可以是空字符串。我想给变量分配一个非空值,以便在某个地方使用它。有没有更好的方法用Scala编写

import scala.collection.mutable
var keyvalue = mutable.Map.empty[String, String]
keyvalue += ("key1" -> "value1")

var myvalue = ""
if (keyvalue.get("key1").isDefined &&
    keyvalue("key1").length > 0) {
  myvalue = keyvalue("key1")
}
else if (keyvalue.get("key2").isDefined &&
    keyvalue("key2").length > 0) {
  myvalue = keyvalue("key2")
}
else if (keyvalue.get("key3").isDefined &&
    keyvalue("key3").length > 0) {
  myvalue = keyvalue("key3")
}

更惯用的方法是使用
filter
检查
选项
中包含的字符串长度,然后
orElse
getOrElse
分配给val。一个粗略的示例:

def getKey(key: String): Option[String] = keyvalue.get(key).filter(_.length > 0)

val myvalue: String = getKey("key1")
    .orElse(getKey("key2"))
    .orElse(getKey("key3"))
    .getOrElse("")
这里有一个类似的方法来处理任意的回退键列表。使用
视图
collectFirst
,我们将只计算
keyvalue。获取
的次数与我们需要的次数相同(如果没有匹配项,则全部)


嗯,似乎我花了太长时间才设计出一个通用的解决方案,其他答案也被接受了,但这里是这样的:

     def getOrTryAgain(map: mutable.Map[String, String], keys: List[String]): Option[String] =
     {
        if(keys.isEmpty)
           None
        else
           map.get(keys.head).filter(_.length > 0).orElse(getOrTryAgain(map, keys.tail))
     }
     val myvalue2 = getOrTryAgain(keyvalue, List("key1", "key2", "key3"))

您可以使用此项检查任意数量的钥匙。

您的问题不清楚。请详细说明并在代码中添加注释,以便我能提供帮助。+2提供效率指导。
     def getOrTryAgain(map: mutable.Map[String, String], keys: List[String]): Option[String] =
     {
        if(keys.isEmpty)
           None
        else
           map.get(keys.head).filter(_.length > 0).orElse(getOrTryAgain(map, keys.tail))
     }
     val myvalue2 = getOrTryAgain(keyvalue, List("key1", "key2", "key3"))