我有一个包含各种指标数据的Map[String, Boolean]
和一个包含metricKeys
的单独的Seq[String]
。
问题是映射可能不包含所有metricKeys
,但我还需要保留有关不存在值的信息。
我尝试使用 .getOrElse
来解决这个问题。我预计生成的带有指标值的 List[String]
将包含“Y”(表示 true
)、“N”(表示 false
)和“”(表示 true
) 空
值。
但是我收到警告:无法访问的代码案例_ => StringUtils.EMPTY
。
让默认值也正确匹配的正确方法是什么?
def parseMetrics(metric: Metric): List[String] = {
import scala.collection.JavaConverters._
val metricKeys: Seq[String] = getMetricKeys
val matricsData = metric.transactionMap.asScala
metricKeys.map(key => key -> matricsData.getOrElse(key, null))
.toMap.values.map(Predef.Boolean2boolean).collect {
case true => "Y"
case false => "N"
case _ => StringUtils.EMPTY
}.toList
}
最佳答案
我假设这是 this question 的后续内容并且 matricsData
的类型类似于 Map[String, java.lang.Boolean]
?
问题是,当参数为 null
时,从装箱 Java boolean 值到 Scala boolean 值的 Predef.Boolean2boolean
转换会返回 false
,因此如果您想区分 java.lang.Boolean
的 true、false 和 null
值,您需要在转换之前执行此操作(无论该转换是否有效)是明确的,就像这里一样)。
不过,还有更好的方法来解决这个问题,如下所示:
metricKeys.map { key =>
matricsData.get(key) match {
case Some(value) => if (value) "Y" else "N"
case None => StringUtils.EMPTY
}
}
或者在 Option
上使用 fold
而不是模式匹配:
metricKeys.map { key =>
matricsData.get(key).fold(StringUtils.EMPTY) { value =>
if (value) "Y" else "N"
}
}
或者先转换映射值,然后查找所有键:
val asYN: Map[String, String] = matricsData.mapValues { value =>
if (value) "Y" else "N"
}
metricKeys.map(key => asYN.getOrElse(key, StringUtils.EMPTY))
您选择哪种方法取决于个人喜好,但任何一种方法都比使用盒装 Java boolean 值对某种三向真或假或缺失数据进行建模更好。
关于java - Scala - 当模式匹配 boolean 值和默认值时无法访问代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54867404/