多个if-else语句从Scala中的映射中获取非空值
我有一个字符串到字符串的映射,它的值可以是空字符串。我想给变量分配一个非空值,以便在某个地方使用它。有没有更好的方法用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 &&
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"))