我嵌套了如下地图:
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)
那么,如何提供隐式视图以展平上述地图?
您想丢失有关“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)]。
| 归档时间: |
|
| 查看次数: |
1836 次 |
| 最近记录: |