Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala-模式匹配布尔值和默认值时无法访问的代码_Java_Scala_Collections_Pattern Matching - Fatal编程技术网

Java Scala-模式匹配布尔值和默认值时无法访问的代码

Java Scala-模式匹配布尔值和默认值时无法访问的代码,java,scala,collections,pattern-matching,Java,Scala,Collections,Pattern Matching,我有一个带有各种度量数据的Map[String,Boolean],还有一个单独的Seq[String]包含metricKeys 问题是映射可能不包含所有的metricKeys,但我还需要保留关于不存在值的信息。 我试图通过使用.getOrElse来解决这个问题。我希望生成的带有度量值的列表[String]将包含true的“Y”、false的“N”和null值的“N” 但是我得到了一个警告:不可访问的代码大小写=>StringUtils.EMPTY。 获得默认值也正确匹配的正确方法是什么 def

我有一个带有各种度量数据的
Map[String,Boolean]
,还有一个单独的
Seq[String]
包含
metricKeys

问题是映射可能不包含所有的
metricKeys
,但我还需要保留关于不存在值的信息。 我试图通过使用
.getOrElse
来解决这个问题。我希望生成的带有度量值的
列表[String]
将包含
true
的“Y”、
false
的“N”和
null
值的“N”

但是我得到了一个警告:
不可访问的代码大小写=>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
}

只需使用map.get,它将返回选项[Boolean],
然后在一些(真)、一些(假)和无上使用case

我假设这是MatricData的后续版本,
MatricData
的类型类似于
Map[String,java.lang.Boolean]

然后,问题是当参数为
null
时,从装箱Java布尔值到Scala布尔值的
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
  }
}
或者使用
选项上的
折叠
,而不是模式匹配:

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

您认为布尔值的第三个值是什么?真和假是布尔值唯一可能的两个值。如果您对布尔值进行匹配,请尝试使用任何c不正确或错误的ASE将抛出此警告。此外,您不应该在Scala中使用
null