Scala-模式匹配布尔值和默认值

时间:2019-02-25 13:32:56

标签: java scala collections pattern-matching

我有一个包含各种指标数据的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
}

2 个答案:

答案 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