同一事物的这两个示例之间是否有一些权衡?
我的偏见是始终使用函数式样式,但是如果我运行数十亿个这样foldLeft
的 s,是否为每个列表中的每一步创建一个新FunctionalA
的比仅更新 a 效率低var
?
一个通用的值集合:
case class B(b: Int)
val bb = (1 to 20).toList.map(B(_))
命令式折叠:
class ImperativeA {
var a = 0
def ingest(x: B): Unit = a += x.b
}
val imperative_fold =
bb.foldLeft(new ImperativeA)((a,b) => {a ingest b; a} )
imperative_fold.a // 210
折叠功能:
class FunctionalA(val a: Int = 0) {
def ingest(x: B) = new FunctionalA(a + x.b)
}
val functional_fold =
bb.foldLeft(new FunctionalA())(_ ingest _)
functional_fold.a // 210