我有以下代码段:
import scala.io.Source
object test extends App {
val lineIterator = Source.fromFile("test1.txt").getLines()
val fileContent = lineIterator.foldLeft(List[String]())((list, currentLine) => {
currentLine :: list
list
})
fileContent foreach println
}
假设test1.txt
文件不为空并且其中包含一些值。
所以关于foldLeft
函数的问题是,为什么这个例子返回一个空列表,当我删除list
函数末尾的foldLeft
时它有效?
为什么它返回值fileContent
下的空列表?
答案 0 :(得分:4)
第currentLine :: list
行不会改变原始列表。它会创建一个前缀为currentLine
的新列表,并返回该新列表。当此表达式不是块中的最后一个表达式时,它将被丢弃,并且将返回(仍然)空list
。
当您最后删除list
时,您实际上会返回currentLine :: list
。
答案 1 :(得分:1)
使用一些起始值(在您的情况下为空列表)和一个函数调用foldLeft
,该函数接受累加器和当前值。此函数返回新列表。在您的实现中,第一次调用的空列表将传播到函数执行的末尾。这就是你得到一个空列表的原因。
请查看此示例:https://twitter.github.io/scala_school/collections.html#fold
答案 2 :(得分:0)
list是不可变的,因此在currentLine :: list之后它仍然是空的。因此括号内的代码返回一个空List,然后用下一个项折叠,仍返回一个空List。