例如,如果您有数百万个元素,但通常只需要检查前一百万个(例如,如果您正在累积一个总和并且您在某个最大值处饱和,或者您正在构建一些其他复杂的数据结构,但您在检查后完成前 M 个元素)。 FoldLeft 总是强制您遍历整个序列。理想情况下,您可以提供一个谓词,让 foldLeft 知道您已完成。

如果 scanLeft 被懒惰地评估(?),也许 scanLeft 与查找(查找第一个有效元素)一起可以完成此操作。我相信像这样的东西可以在 Haskell 中工作,但不确定 Scala。

numbers.scanLeft(0)((a, b) => a + b).find(_ >= 100)

所以如果 numbers = List(100,0,9,10),那么 scanLeft 只会查看第一个元素。

最佳答案

scanLeft 为已经惰性的集合生成惰性集合,例如 Iterator LazyList ( Strem 之前的 2.13 )。因此,您可以使用它来提前中止。
例如:

LazyList.continually(100)
  .scanLeft(0) { case (acc, n) => acc + n }
  .takeWhile(_ < 1000)
  .toList
// res: List[Int] = List(0, 100, 200, 300, 400, 500, 600, 700, 800, 900)

List(0, 100, 5, 300)
  .iterator
  .map(i => { println(i); i })
  .scanLeft(0) { case (acc, n) => acc + n }
  .find(_ >= 100)
// 0
// 100
// res: Option[Int] = Some(100)

关于scala - 当您并不总是需要检查列表的所有元素时,您如何提高 foldLeft(或 scanLeft)的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59867149/

10-16 02:00