多个 if else 语句从 Scala 中的映射获取非空值
Multiple if else statements to get non-empty value from a map in Scala
我有一个字符串到字符串的映射,它的值可以是一个空字符串。我想为变量分配一个非空值以在某处使用它。在 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
检查Option
中包含的字符串的长度,然后orElse
和getOrElse
分配给一个瓦尔。一个粗略的例子:
def getKey(key: String): Option[String] = keyvalue.get(key).filter(_.length > 0)
val myvalue: String = getKey("key1")
.orElse(getKey("key2"))
.orElse(getKey("key3"))
.getOrElse("")
这是使用任意后备键列表的类似方法。使用 view
和 collectFirst
,我们只会根据需要计算 keyvalue.get
的次数(或者全部,如果没有匹配)。
val myvalue: String = List("key1", "key2", "key3").view
.map(keyvalue.get)
.collectFirst { case Some(value) if(value.length > 0) => value }
.getOrElse("")
嗯,我似乎花了很长时间才设计出一个通用的解决方案,其他答案也被接受了,但这里是这样的:
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"))
您可以使用这个来检查任意数量的密钥。
我有一个字符串到字符串的映射,它的值可以是一个空字符串。我想为变量分配一个非空值以在某处使用它。在 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
检查Option
中包含的字符串的长度,然后orElse
和getOrElse
分配给一个瓦尔。一个粗略的例子:
def getKey(key: String): Option[String] = keyvalue.get(key).filter(_.length > 0)
val myvalue: String = getKey("key1")
.orElse(getKey("key2"))
.orElse(getKey("key3"))
.getOrElse("")
这是使用任意后备键列表的类似方法。使用 view
和 collectFirst
,我们只会根据需要计算 keyvalue.get
的次数(或者全部,如果没有匹配)。
val myvalue: String = List("key1", "key2", "key3").view
.map(keyvalue.get)
.collectFirst { case Some(value) if(value.length > 0) => value }
.getOrElse("")
嗯,我似乎花了很长时间才设计出一个通用的解决方案,其他答案也被接受了,但这里是这样的:
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"))
您可以使用这个来检查任意数量的密钥。