ang*_*okh 2 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 &&
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")
}
Run Code Online (Sandbox Code Playgroud)
更惯用的方式是使用filter
检查包含在该字符串的长度Option
,然后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("")
Run Code Online (Sandbox Code Playgroud)
这是使用任意回退键列表执行此操作的类似方法.使用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("")
Run Code Online (Sandbox Code Playgroud)