【发布时间】:2013-10-06 13:42:19
【问题描述】:
听Functional Programming Principles in Scala的Collections讲座,我看到了这个例子:
scala> val s = "Hello World"
scala> s.flatMap(c => ("." + c)) // prepend each element with a period
res5: String = .H.e.l.l.o. .W.o.r.l.d
然后,我很好奇为什么奥德斯基先生没有在这里使用map。但是,当我尝试使用 map 时,得到的结果与我预期的不同。
scala> s.map(c => ("." + c))
res8: scala.collection.immutable.IndexedSeq[String] = Vector(.H, .e, .l, .l, .o,
". ", .W, .o, .r, .l,
我希望上面的调用返回一个字符串,因为我是map-ing,即对“序列”中的每个项目应用一个函数,然后返回一个新的“序列”。
但是,我可以为List[String] 执行map 而不是flatmap:
scala> val sList = s.toList
sList: List[Char] = List(H, e, l, l, o, , W, o, r, l, d)
scala> sList.map(c => "." + c)
res9: List[String] = List(.H, .e, .l, .l, .o, ". ", .W, .o, .r, .l, .d)
为什么IndexedSeq[String] 是在字符串上调用map 的返回类型?
【问题讨论】:
-
因为你不能把两个字符放在一个Char类型中?而字符+字符是产生String类型的两个字符。