java - Scala - 当模式匹配 boolean 值和默认值时无法访问代码

标签 java scala collections pattern-matching

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

相关文章:

java - Hibernate - 重写旧版 createCriteria

Java cmd 关闭 CreateProcess error=2

Scala 禁止分配值类

Scala、Specs2 和共享状态

scala - Spark/Scala在多个列上使用相同的函数重复调用withColumn()

java - 不区分大小写的搜索和替换

java - 多键数据结构的操作

Java 集合 : List<Animal> tiger = new ArrayList<Tiger>() WRONG

c# - 适用于 .NET 的 Microsoft 集合

java - 使用 Comparator 和 Arrays.asList() 进行排序