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

标签 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")
}

最佳答案

更惯用的方法是使用filter检查Option中包含的字符串的长度,然后使用orElsegetOrElse 分配给一个 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("")

这是使用任意回退键列表的类似方法。使用 viewcollectFirst,我们将只评估 keyvalue.get 我们需要的次数(或者全部,如果有没有匹配项)。

val myvalue: String = List("key1", "key2", "key3").view
    .map(keyvalue.get)
    .collectFirst { case Some(value) if(value.length > 0) => value } 
    .getOrElse("")

关于scala - 多个 if else 语句从 Scala 中的映射获取非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29130904/

相关文章:

scala - 使用列表作为输入在 scala 中运行函数

java - Scala 集合标准实践

Scala 多类型模式匹配

scala - 每个案例都是 ScalaTest 中的单独测试 - JUnit ParameterizedTest 风格

scala - 如何将整数列表转换为每个 bin 频率的 map ?

Scala:方便绑定(bind)集合类型参数

scala - 给定集合 A 和 B,是否有标准库函数来生成 3-ple(A - B、交集、B - A)?

json - 在 Play 2.1 Json Api 中获取异常行号?

scala - 迷失在 Scala 集合的继承图中

java - Vert.x IO 阻塞操作性能