Scala getLines()的收益率不如我预期的那样

时间:2011-08-24 00:56:41

标签: scala

我对“Scala编程”一书的理解是,以下内容应返回Array[String],而不是返回Iterator[String]。我错过了什么?

val data = for (line <- Source.fromFile("data.csv").getLines()) yield line

我正在使用Scala 2.9 提前谢谢。

3 个答案:

答案 0 :(得分:12)

您希望阅读的章节了解发生了什么http://www.artima.com/pins1ed/for-expressions-revisited.html

for (x <- expr_1) yield expr_2 

被翻译为

expr_1.map(x => expr_2)

因此,如果expr_1Iterator[String]一样,那么expr_1.map(line => line)也是Iterator[String]

答案 1 :(得分:2)

不,它会返回Iterator。请参阅:http://www.scala-lang.org/api/current/index.html#scala.io.BufferedSource

但如果Array是您的目标,则以下内容应该有效:

Source.fromFile("data.csv").getLines().toArray

如果您想将Iterator转换为Array(如评论中所述),请在投放Iterator之后尝试以下操作:

data.toArray

答案 2 :(得分:0)

@dhg是正确的,这里有更详细的原因。

示例中的代码调用Source.fromFile,它返回一个BufferedSource。然后调用getLines返回一个迭代器。然后,该迭代器被生成并存储为数据。

在Iterator上调用toArray会为你提供一系列你想要的字符串。