2

I have the following code snippet:

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

}

Let's assume the test1.txt file is not empty and has some values in it. So my question about the foldLeft function is, why does this example here return an empty list, and when I remove the list at the end of the foldLeft function it works? Why is it returning an empty list under the value fileContent?

4

3 回答 3

5

该行currentLine :: list不会改变原始列表。它创建一个带有currentLine前置的新列表,并返回该新列表。当这个表达式不是你的块中的最后一个时,它将被丢弃,并且(仍然)空的list将被返回。

当您list最后删除时,您实际上会返回currentLine :: list.

于 2016-09-09T16:48:44.500 回答
2

foldLeft使用一些起始值(在您的情况下为空列表)和一个函数调用,该函数接受一个累加器和当前值。然后此函数返回新列表。在您的实现中,第一次调用的空列表将传播到函数执行结束。这就是为什么你得到一个空列表的原因。

请看这个例子:https ://twitter.github.io/scala_school/collections.html#fold

于 2016-09-09T16:48:29.263 回答
0

list 是不可变的,所以在 currentLine :: list 之后它仍然是空的。因此括号内的代码返回一个空列表,然后与下一个项目折叠,仍然返回一个空列表。

于 2016-09-09T16:48:02.143 回答