Scala foldLeft with List

时间:2016-09-09 16:40:15

标签: scala functional-programming foldleft

我有以下代码段:

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下的空列表?

3 个答案:

答案 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。