Scala ListBuffer可以防止堆栈溢出的可能性?

时间:2016-06-30 11:24:20

标签: scala

在Scala的编程(Martin Odersky)的第17.1节(集合)中,有一行说:

  

使用ListBuffer而不是List的另一个原因是为了防止堆栈溢出的可能性。

使用ListBuffer如何防止堆栈溢出的可能性? ......没有双关语; - )

1 个答案:

答案 0 :(得分:0)

这本书给出了the answer

  

如果你可以通过预先设置按所需顺序构建一个列表,但是所需的递归算法不是尾递归的,你可以使用for表达式或while循环和ListBuffer。

An example用于在不使用List函数的情况下递增map的每个元素的函数。

def incAllUnsafe(xs: List[Int]): List[Int] = xs match {
  case List() => List()
  case x :: xs1 => x + 1 :: incAllUnsafe(xs1)
}

def incAllSafe(xs: List[Int]): List[Int] = {
  val buf = new scala.collection.mutable.ListBuffer[Int]
  for (x <- xs) buf += x + 1
  buf.toList
}