这是一个简单的scala代码
scala> val x = scala.collection.immutable.TreeMap[String, String]("a"->"a", "b"->"b")
x: scala.collection.immutable.TreeMap[String,String] = Map(a -> a, b -> b)
scala> val y = x.fold(""){case (acc: String, (k: String, v: String)) => acc + s""", "$k":"$v""""}
y: java.io.Serializable = , "a":"a", "b":"b"
Run Code Online (Sandbox Code Playgroud)
为什么返回类型y不是String而是java.io.Serializable?
我认为这可能是因为我正在使用模式匹配,匹配可能并非详尽无遗.所以我将代码更改为
scala> val y = x.fold(""){case (acc: String, (k:String, v:String)) => acc + s""", "$k":"$v"""" case _ => ""}
y: java.io.Serializable = , "a":"a", "b":"b"
Run Code Online (Sandbox Code Playgroud)
签名fold是:
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1
Run Code Online (Sandbox Code Playgroud)
折叠操作(op)的两个操作数必须是相同的类型,但在你的情况下它们是String和(String, String),所以编译器试图寻找两种类型之间的最小上限,并找到Serializable.
foldLeft并foldRight允许累加器和下一个元素是不同的类型,因此这些可以工作.
scala> x.foldLeft("") { case (acc, (k, v)) => acc + s""", "$k":"$v"""" }
res8: String = , "a":"a", "b":"b"
Run Code Online (Sandbox Code Playgroud)
折叠并不是你想要的,但是,除非你特别处理它,否则你最终会得到额外的逗号.相反,你可以使用map和mkString.
scala> x.map { case (k, v) => s""""$k":"$v"""" }.mkString(", ")
res10: String = "a":"a", "b":"b"
Run Code Online (Sandbox Code Playgroud)
我也删除了类型归属,因为它们不是必需的.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |