如何在Scala HashMap中访问指定嵌套元素?
解决Scala HashMap键为Map时的访问问题
问题根源
你无法获取元素的核心原因是:你创建的查询键Map,和目标HashMap中实际存储的键Map类型/实现不一致,导致equals比较失败,返回None。比如原键是immutable.Map,你用mutable.HashMap去匹配,或者反之,都会导致匹配失败。
解决方案
方案1:匹配原键的实际类型访问
- 先确认目标HashMap中键的具体类型:
// 安全获取内层HashMap,避免直接.get抛出异常 val innerMapOpt = result.accountDetail.outs.get("Total_Before_Tax") // 打印键的实际类型 innerMapOpt.foreach(map => println(map.keys.head.getClass))
执行后会输出类似class scala.collection.immutable.HashMap或class scala.collection.mutable.TreeMap的结果。
- 用完全相同的类型创建查询键:
如果原键是Scala默认的immutable.Map:
val targetKey = Map( "bill_category" -> "Total_Before_Tax", "bill_presentation_category" -> "audit", "bill_super_category" -> "audit_charge" ) // 安全获取值,不会抛出异常 val targetValueOpt = innerMapOpt.flatMap(_.get(targetKey))
如果原键是mutable.HashMap:
import scala.collection.mutable val targetKey = mutable.HashMap( "bill_category" -> "Total_Before_Tax", "bill_presentation_category" -> "audit", "bill_super_category" -> "audit_charge" ) val targetValueOpt = innerMapOpt.flatMap(_.get(targetKey))
方案2:直接取唯一元素(更简单)
既然IDE显示内层HashMap只有一个元素,完全可以跳过键匹配,直接取值:
// 安全获取唯一元素的值 val targetValueOpt = innerMapOpt.map(_.values.head)
注意事项
- 永远避免直接调用
Option.get,如果outs.get("Total_Before_Tax")返回None,会直接抛出NoSuchElementException。用flatMap、map或模式匹配处理Option才是Scala的正确写法。
内容的提问来源于stack exchange,提问作者Big McLargeHuge
相关产品推荐
相关产品推荐

