假设我有一个大文本文件,格式如下:
部分开始...... ......部分结束部分开始...... ...... 部分结束....
我想解析文件并逐节使用它,但是我不想将整个内容保存在内存中,我想阅读一个部分并对该部分进行一些操作,例如将其插入数据库,然后将其丢弃并继续阅读下一部分,我该如何以功能方式执行此操作?我只能通过操纵可变变量来提出一些实现。
答案 0 :(得分:2)
您总是可以通过编写(尾部)递归函数*
来解决这些问题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
注释确保。