1
假设我有一个具有类似格式的大文本文件:读取大文件和处理逐节
节开始... ... ...第一节结束节开始...。 ...... 第一节结束....
我想分析该文件,并使用它一段一段,但我不想保留在内存中的全部内容,我想读一个部分,并对该部分进行一些操作,例如将其插入到数据库中,然后丢弃它并继续阅读下一节,我应该如何以功能方式执行此操作?我只能通过操作可变变量来实现一些实现。
假设我有一个具有类似格式的大文本文件:读取大文件和处理逐节
节开始... ... ...第一节结束节开始...。 ...... 第一节结束....
我想分析该文件,并使用它一段一段,但我不想保留在内存中的全部内容,我想读一个部分,并对该部分进行一些操作,例如将其插入到数据库中,然后丢弃它并继续阅读下一节,我应该如何以功能方式执行此操作?我只能通过操作可变变量来实现一些实现。
你总是可以通过写一个(尾)递归函数*
def parseLines(
in: Iterator[String],
thisSection: List[String] = Nil,
results: List[Foo] = Nil
): List[Foo] = {
if (!in.hasNext) results.reverse
else in.next match {
case "SECTION END" =>
val section = thisSection.reverse.drop(1)
// Do something with data
val foo = // whatever you need to store from this section
parseLines(in, Nil, foo :: results)
case s =>
parseLines(in, s :: thisSection, results)
}
}
解决这些各种各样的问题,但它并不总是更好地做到这一点,而不是使用可变的变量。关键是要保持良好的可变性,以便改变状态不会泄露,并且使程序其余部分的逻辑复杂化。在这样的方法中添加一个累加器变量,而不是使其递归,这也非常合适。挑选哪一个使得逻辑更清晰。
* 最好是尾递归或堆栈溢出。使用@tailrec
注释来确保。