【问题标题】:Scala foldLeft with a List带有列表的Scala foldLeft
【发布时间】:2016-09-09 16:40:14
【问题描述】:

我有以下代码sn-p:

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 函数的问题是,为什么这里的示例返回一个空列表,而当我在foldLeft 函数的末尾删除list 时它会起作用吗? 为什么它在值fileContent 下返回一个空列表?

【问题讨论】:

    标签: scala functional-programming foldleft


    【解决方案1】:

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

    当你删除最后的list,你实际上会返回currentLine :: list

    【讨论】:

    • 很好的解释……我也是这么想的
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-04
        • 2012-04-28
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        相关资源
        最近更新 更多