【问题标题】:Scala - unreachable code when pattern matching Boolean values and a defaultScala - 模式匹配布尔值和默认值时无法访问的代码
【发布时间】:2019-02-25 13:32:55
【问题描述】:

我有一个包含各种指标数据的 Map[String, Boolean] 和一个包含 metricKeys 的单独 Seq[String]

问题是地图可能不包含所有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
}

【问题讨论】:

  • 你认为布尔值的第三个值是什么?
  • true 和 false 是布尔值仅有的两个值。如果您正在对布尔值进行匹配,则尝试使用任何不正确或不正确的情况都会引发此警告。此外,您不应该在 Scala 中使用 null

标签: java scala collections pattern-matching


【解决方案1】:

我假设这是this question 的后续,matricsData 的类型类似于Map[String, java.lang.Boolean]

然后的问题是,当 Predef.Boolean2boolean 的参数是 null 时,从盒装 Java 布尔值到 Scala 布尔值的 Predef.Boolean2boolean 转换返回 false,所以如果你想区分真、假和 null 值987654328@,您需要在转换之前执行此操作(无论该转换是否明确,如此处所示)。

不过,有更好的方法来解决这个问题,如下所示:

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 布尔值对某种三向真或假或缺失数据建模要好。

【讨论】:

    【解决方案2】:

    只需使用map.get,它将返回Option[Boolean], 然后是 Some(true)、Some(false) 和 None

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多