Scala如何拼合嵌套Map [String,Any]

时间:2017-04-07 11:31:49

标签: scala

我有如下嵌套地图:

val x: Map[String, Any] = 
  Map("a" -> "apple", "b" -> "ball", "c" -> Map("x" -> "cat", "y" -> 12))

我希望将其转换为:

Map("a" -> "apple", "b" -> "ball", "x" -> "cat", "y" -> 12)

但是,如果我尝试将flatten调用为x,则会出现异常。

x.flatten
Error:(40, 14) No implicit view available from (String, Any) => scala.collection.GenTraversableOnce[B].
println(mx.flatten)
Error:(40, 14) not enough arguments for method flatten: (implicit asTraversable: ((String, Any)) => scala.collection.GenTraversableOnce[B])scala.collection.immutable.Iterable[B].
Unspecified value parameter asTraversable.
println(x.flatten)

那么,我怎样才能提供隐式视图以展平上面的地图?

1 个答案:

答案 0 :(得分:3)

你想要放弃关于'c'的信息有点奇怪 但无论如何,编译器抱怨是因为它不知道如何转换(String,Any),你的Key - >价值对成为可交叉的,这是合乎逻辑的 您可以为编译器提供一个提示,如果'Any'是Map,它应该只使用这些值并松开键。

例如:

x.flatten {
  case ((key, map : Map[String, Any])) => map
  case ((key, value)) => Map(key -> value)
}.toMap

返回

Map(a -> apple, b -> ball, x -> cat, y -> 12)

注意:需要'toMap',因为'flatten'返回List [(String,Any)]。