【发布时间】:2020-05-01 15:16:59
【问题描述】:
我有一个简单的方法可以从哈希图中检索嵌套键。我需要在Map[String,Any] 上进行模式匹配,以便我可以继续迭代嵌套数据,直到我得到一个平坦的值:
def get(map: Map[String, Any], key: String): Any = {
var fields: mutable.Seq[String] = key.split('.')
var currentKey: String = fields.head
var currentValue: Any = map
while (fields.nonEmpty && currentValue.isInstanceOf[Map[String, Any]]) {
currentKey = fields.head
fields = fields.drop(1)
currentValue match {
case m: Map[String, Any] => currentValue = m.getOrElse(currentKey, None)
case _ =>
}
}
if (fields.nonEmpty) None else currentValue
}
当我仅在 scala 中使用它时它可以工作,但如果它是从 java 调用的,我会收到错误 non-variable type argument String in type scala.collection.immutable.Map[String,Any]。
我见过一些其他的解决方案,它们要求您重构代码并将地图包装在案例类中,但这会对依赖此方法的所有代码造成很大的破坏。有没有更简单的解决方法?
【问题讨论】:
-
不小心被标记为js。感谢您的编辑!
-
当您从 Java 中调用 Java
Maps 时,您是如何将其转换为 ScalaMaps 的? -
这是我仍在努力的事情,正在考虑使用
HashMap<String, Object>。但现在我将它作为 json 传递并在使用get()之前自己反序列化它 -
在这种情况下,错误可能出在创建
Map的代码中,而不是在此方法中。不要忘记编译器警告,它会告诉您类型匹配由于类型擦除而无法正常工作。
标签: scala type-conversion pattern-matching scala-java-interop