我有一组字符串,并使用它作为键值从Map中获取jvalue:
val keys: Set[String] = Set("Metric_1", "Metric_2", "Metric_3", "Metric_4")
val logData: Map[String, JValue] = Map("Metric_1" -> JInt(0), "Metric_2" -> JInt(1), "Metric_3" -> null)
在下面的方法中,我解析每个度量的值。首先获取所有值,然后过滤以除去空值,然后将现有值转换为布尔值。
val metricsMap: Map[String, Boolean] = keys
.map(k => k -> logData(k).extractOpt[Int]).toMap
.filter(_._2.isDefined)
.collect {
case (str, Some(0)) => str -> false
case (str, Some(1)) => str -> true
}
我遇到了一个问题 keys
在中找不到 logData
Map。所以我得到了一个 java.util.NoSuchElementException: key not found: Metric_4
.
这是我用的 extractOpt
从json中提取值,不需要默认值。所以很可能 extractOrElse
不会有帮助,因为我只需要获取现有键的值并跳过不存在的键。
当钥匙不在保险箱中时,处理案件的正确方法是什么 logData
Map?
upd:我已经达到了预期的效果 .map(k => k -> apiData.getOrElse(k, null).extractOpt[Int]).toMap
. 但是仍然不确定这是最好的方法。
1条答案
按热度按时间igetnqfo1#
值是json是一个危险的问题——引发异常的是缺少的键。有一个方法叫做
get
从封装在选项中的Map中检索值。如果我们使用Int
作为我们的价值观:使用
flatMap
而不是map
意味着打开Some
结果并删除None
s。现在,如果我们回到你的实际例子,我们有另一层,平面图将消除Metric_3 -> null
项目:您也可以使用
for
理解力:我曾经
Success
以及Failure
代替json值,以避免必须使用json4s设置shell来制作示例: