sam*_*mba 0 java collections scala pattern-matching
我有一个Map[String, Boolean]与各种度量数据和一个单独的Seq[String]包含metricKeys.
问题是Map可能不包含所有,metricKeys但我需要保留有关不存在的值的信息.我试过通过使用来解决这个问题.getOrElse.我预计List[String]带有度量值的结果将包含"Y"表示true"N" false,""表示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
}
Run Code Online (Sandbox Code Playgroud)
我假设这是这个问题的后续行动,matricsData有类似的类型Map[String, java.lang.Boolean]?
接下来的问题是Predef.Boolean2boolean从盒装的Java布尔值到Scala布尔值的转换false在它的参数出现时返回null,所以如果你想区分true,false和null值java.lang.Boolean,你需要在转换之前做到这一点(无论是否转换是明确的,因为它在这里).
但是,有更好的方法可以解决这个问题,如下所示:
metricKeys.map { key =>
matricsData.get(key) match {
case Some(value) => if (value) "Y" else "N"
case None => StringUtils.EMPTY
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用foldon Option而不是模式匹配:
metricKeys.map { key =>
matricsData.get(key).fold(StringUtils.EMPTY) { value =>
if (value) "Y" else "N"
}
}
Run Code Online (Sandbox Code Playgroud)
或者首先转换地图值,然后查找所有键:
val asYN: Map[String, String] = matricsData.mapValues { value =>
if (value) "Y" else "N"
}
metricKeys.map(key => asYN.getOrElse(key, StringUtils.EMPTY))
Run Code Online (Sandbox Code Playgroud)
您选择哪种方法是一种品味问题,但这些方法都比使用盒装Java布尔值来模拟某种三向真或假或缺失数据更好.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |