我有一个包含各种指标数据的Map[String, Boolean]
和一个单独的Seq[String]
,其中包含metricKeys
。
问题是地图可能不包含所有metricKeys
,但我还需要保留有关不存在的值的信息。
我尝试使用.getOrElse
解决此问题。我希望得到的具有度量标准值的List[String]
包含true
的“ Y”,false
的“ N”和null
的“”。
但是我收到警告:unreachable code case _ => 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
}
答案 0 :(得分:7)
我假设这是this question的后续版本,并且matricsData
的类型类似于Map[String, java.lang.Boolean]
?
然后的问题是,从Predef.Boolean2boolean
的框式Java布尔值到Scala布尔值的转换在其参数为false
时返回null
,因此,如果要区分true,false和null
的{{1}}值,您需要在转换之前执行此操作(无论转换是否显式,如此处所示)。
但是,有更好的方法可以解决此问题,如下所示:
java.lang.Boolean
或在metricKeys.map { key =>
matricsData.get(key) match {
case Some(value) => if (value) "Y" else "N"
case None => StringUtils.EMPTY
}
}
上使用fold
而不是模式匹配:
Option
或先转换地图值,然后查找所有键:
metricKeys.map { key =>
matricsData.get(key).fold(StringUtils.EMPTY) { value =>
if (value) "Y" else "N"
}
}
您选择哪种方法只是一个品味问题,但是这些方法中的任何一个都比使用带框的Java布尔值对某种三路真假或缺失数据建模更好。
答案 1 :(得分:-1)
只需使用map.get,它将返回Option [Boolean], 然后用Some(true),Some(false)和None