如何从Map[String, Any]的WrappedArray嵌套Map中提取non_unique对应值?
解决Scala中从Map[String, Any]提取指定metric值的问题
步骤1:将Any类型转换为具体集合类型
你通过metrics.get("metrics").get拿到的metricToInvestigate是Any类型,需要先转换为明确的集合类型(这里是Seq[Map[String, Any]],因为WrappedArray是Scala标准库中Seq的实现类):
// 安全获取并转换类型,提前处理key不存在或类型不匹配的情况 val metricsArray = metrics.get("metrics") match { case Some(arr: Seq[_]) => arr.asInstanceOf[Seq[Map[String, Any]]] case _ => Seq.empty[Map[String, Any]] }
步骤2:提取目标metric值
遍历转换后的集合,找到metric_name为non_unique的元素,再取出对应的metric_value:
// 查找并提取non_unique对应的数值,同时处理异常情况 val nonUniqueValue = metricsArray.find { metricMap => metricMap.get("metric_name").contains("non_unique") }.flatMap(_.get("metric_value")) match { case Some(value: Int) => value case _ => 0 // 当找不到目标metric或类型不匹配时返回默认值 }
简化版(适合确定数据结构的场景)
如果能确定数据结构不会出错,可以用更简洁的写法:
val nonUniqueValue = metrics("metrics") .asInstanceOf[Seq[Map[String, Any]]] .find(_("metric_name") == "non_unique") .map(_("metric_value").asInstanceOf[Int]) .getOrElse(0)
内容的提问来源于stack exchange,提问作者Lapchi
相关产品推荐
相关产品推荐

