Scala 如何展平嵌套的 Map[String, Any]

Ra *_* Ka 0 scala

我嵌套了如下地图:

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

我想把它转换成:

Map("a" -> "apple", "b" -> "ball", "x" -> "cat", "y" -> 12)
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将 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)
Run Code Online (Sandbox Code Playgroud)

那么,如何提供隐式视图以展平上述地图?

Joo*_*oer 5

您想丢失有关“c”的信息有点奇怪。
但无论如何,编译器正在抱怨,因为它不知道如何将 (String,Any)、您的 Key -> Value 对转换为可遍历的,这是合乎逻辑的。
您可以向编译器提供一个提示,如果“Any”是 Map,则它应该只使用值并丢失密钥。

例如:

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

这返回

Map(a -> apple, b -> ball, x -> cat, y -> 12)
Run Code Online (Sandbox Code Playgroud)

注意: 'toMap' 是必需的,因为 'flatten' 返回一个 List[(String,Any)]。